Friday, 8 March 2013

Namespaces in C++


What is Namespaces in C++ Programming Language:

Using namespace we can have class,global variables,functions under one name. We can change global scope to Sub-scope.
Description: Namespace in c++
Namespace in c++
·         Namespace is a logical compartment used to avoid naming collisions.
·         The naming conflict or Collision always Occurs  may occur -
·         When same program is using more than one library with some variables or functions having same name.
·         The name collision may occur for global variables, global functions, classes etc.
·         Default namespace is global namespace and can access global data and functions by proceeding (::) operator.
·         We can create our own namespace. And anything declared within namespace has scope limited to namespace.

Creating a namespace:

·         Creation of namespace is similar to creation of class.
·         Namespace declarations appear only at global scope.
·         Namespace declarations can be nested within another namespace.
·         Namespace declarations don’t have access specifiers. (Public or private)
·         No need to give semicolon after the closing brace of definition of namespace.
·         We can split the definition of namespace over several units.

Syntax:

namespace namespace_name
{
//member declarations
 
}

Live Example :

//In firstHeader.h
namespace ns1
{
   class one
   {
      //----Declarations---
   };
   class two
   {
      //----Declarations---
   };
}
 
//In secondHeader.h
namespace ns1    // can continue the defination of ns1 over multiple header files
{
   class three
   {
      //----Declarations---
   };
}

What is Unnamed Namespace  ?

·         Unnamed namespaces are the replacement for the static declaration of variables.
·         They are directly usable in the same programand are used for declaring unique identifiers.
·         In unnamed namespaces, name of the namespace in not mentioned in the declaration of namespace.
·         The name of the namespace is uniquely generated by the compiler.
·         The unnamed namespaces you have created will only be accessible within the file you created it in.
#include<iostream>
using namespace std;
 
namespace
{
    int i;
}
 
int main()
{
    i=10;
    cout<< "Value : "<<i;
    return 0;
}
Output:
Value : 10

How to Use Namespaces in C++ Programming Language :

Following are the ways to refer to namespace members:

Way 1 : Using Scope Resolution :

In this method, we use the namespace name, scope resolution operator (::) and member of that namespace.

Way 2 : Using Directive:

We can use ‘using’ directive to specify the namespace.
#include<iostream>
using namespace std;
 
namespace first
{
int i;
}
 
namespace second
{
int i;
}
 
int main()
{
first::i=1;   //scope resolution
second::i=2;
 
using first::i; //using directive
cout<<i;
}

Way 3 : Using declaration:

It is a declaration within the current scope. This means it can override names from a using directive.
#include<iostream>
using namespace std;
 
namespace first
{
int i;
}
using namespace first;// using declaration
int main()
{
i=2;
cout<<"Value : "<<i<<endl;
}
Output:
Value : 2

Different Verities of Using Namespace :

1.We can Have Class Definition inside Namespace

#include <iostream>
using namespace std; 
 
namespace MyNameSpace { 
  int num1; 
  int num2; 
 
  class Student
  { 
     int marks; 
   public: 
     Student() {  
        marks = num1; 
     } 
  }; 
} 
 
int main() 
{ 
  MyNameSpace::num1 = 70; 
  MyNameSpace::num2 = 90; 
 
  MyNameSpace::Student ob1(); 
}
·         num1,num2 are two variables under same namespace name “MyNamespace”.
·         We can Initialize them in main function by using Scope Resolution Operator.
·         We can Declare Class inside Namespace and thus we can have multiple classes with same name but they must be in different namespace.

2.We can Have Same Class Definition inside different Namespace

#include <iostream> 
using namespace std; 
 
namespace MyNameSpace1 { 
  int num1; 
  int num2; 
 
  class Student
  { 
     int marks; 
   public: 
     Student() {  
        marks = num1; 
     } 
  }; 
} 
 
namespace MyNameSpace2 { 
  int num1; 
  int num2; 
 
  class Student
  { 
     int marks; 
   public: 
     Student() {  
        marks = num1; 
     } 
  }; 
} 
 
int main() 
{ 
  MyNameSpace1::num1 = 80; 
  MyNameSpace1::num2 = 50; 
 
  MyNameSpace1::Student ob1(); 
}

Simple Namespace  Example Programs  In C++

Definition

A namespace (sometimes also called a name scope) is an abstract container or environment created to hold a logical grouping of unique identifiers or symbols (i.e., names). An identifier defined in a namespace is associated only with that namespace. The same identifier can be independently defined in multiple namespaces. That is, the meaning associated with an identifier defined in one namespace may or may not have the same meaning as the same identifier defined in another namespace. Languages that support namespaces specify the rules that determine to which namespace an identifier (not its definition) belongs.

The functionality of namespaces is especially useful in the case that there is a possibility that a global object or function uses the same identifier as another one, causing redefinition errors.

Syntax

Declaration:

namespace abc {
 int variable;
}

Adding Namespace:

using namespace abc;

Usage Namespace Member:

abc::variable

Example Program

/*  Example Program For namespace Example In C++
    little drops @ thiyagaraaj.com

    Coded By:THIYAGARAAJ MP             */

#include <iostream>
using namespace std;

//Namespace namespacefirst
namespace namespacefirst
{
  int value = 5;
}

//Namespace namespacesecond
namespace namespacesecond
{
  double value = 3.1416;
}

int main () {
  //Namespace namespacefirst Varibale Usage
  cout << "namespacefirst value : " <<namespacefirst::value << endl;

  //Namespace namespacesecond Varibale Usage
  cout << "namespacesecond value : "<<namespacesecond::value << endl;
  return 0;
}

Sample Output:

namespacefirst value : 5
namespacesecond value : 3.1416
Consider a situation when we have two persons with the same name, Zara, in the same class. Whenever we need to differentiate them definitely we would have to use some addition information along with their name, like either the area if they live in different area or their monther or father name etc.
Same situation can arise in your C++ applications. For example, you might be writing some code that has a function called xyz() and there is another library available which is also having same function xyz(). Now the compiler has no way of knowing which version of xyz() function you are referring to within your code.
A namespace is designed to overcome this difficulty and is used as an additional information to differentiate similar functions, classes, variables etc. with the same name available in different libraries. Using namespace, you can define the context in which names are defined. In essence, a namespace defines a scope.

Defining a Namespace:

A namespace definition begins with the keyword namespace followed by the namespace name as follows:
namespace namespace_name {
   // code declarations
}
To call the namespace-enabled version of either function or variable, prepend the namespace name as follows:
name::code;  // code could be variable or function.
Let us see how namespace scope the entities including variable and functions:
#include <iostream>
using namespace std;
 
// first name space
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// second name space
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
int main ()
{
 
   // Calls function from first name space.
   first_space::func();
   
   // Calls function from second name space.
   second_space::func(); 
 
   return 0;
}
If we compile and run above code, this would produce following result:
Inside first_space
Inside second_space

The using directive:

You can also avoid prepending of namespaces with the using namespace directive. This directive tells the compiler that the subsequent code is making use of names in the specified namespace. The namespace is thus implied for the following code:
#include <iostream>
using namespace std;
 
// first name space
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// second name space
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
using namespace first_space;
int main ()
{
 
   // This calls function from first name space.
   func();
   
   return 0;
}
If we compile and run above code, this would produce following result:
Inside first_space
The using directive can also be used to refer to a particular item within a namespace. For example, if the only part of the std namespace that you intend to use is cout, you can refer to it as follows:
using std::cout;
Subsequent code can refer to cout without prepending the namespace, but other items in the stdnamespace will still need to be explicit as follows:
#include <iostream>
using std::cout;
 
int main ()
{
 
   cout << "std::endl is used with std!" << std::endl;
   
   return 0;
}
If we compile and run above code, this would produce following result:
std::endl is used with std!
Names introduced in a using directive obey normal scope rules. The name is visible from the point of the using directive to the end of the scope in which the directive is found. Entities with the same name defined in an outer scope are hidden.

Discontiguous Namespaces:

A namespace can be defined in several parts and so a namespace is made up of the sum of its separately defined parts. The separate parts of a namespace can be spread over multiple files.
So, if one part of the namespace requires a name defined in another file, that name must still be declared. Writing a following namespace definition either defines a new namespace or adds new elements to an existing one:
namespace namespace_name {
   // code declarations
}

Nested Namespaces:

Namespaces can be nested where you can define one namespace inside another name space as follows:
namespace namespace_name1 {
   // code declarations
   namespace namespace_name2 {
      // code declarations
   }
}
You can access members of nested namespace by using resultion operators as follows:
// to access members of namespace_name2
using namespace namespace_name1::namespace_name2;
 
// to access members of namespace:name1
using namespace namespace_name1;
In the above statements if you are using namespace_name1 then it will make elements of namespace_name2 available in the scope as follows:
#include <iostream>
using namespace std;
 
// first name space
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
   // second name space
   namespace second_space{
      void func(){
         cout << "Inside second_space" << endl;
      }
   }
}
using namespace first_space::second_space;
int main ()
{
 
   // This calls function from first name space.
   func();
   
   return 0;
}
If we compile and run above code, this would produce following result:
Inside second_space

No comments:

Post a Comment