Creating and Using Namespace in C++
Namespace is a container for identifiers. It puts the names of its members in a distinct space so that they don't conflict with the names in other namespaces or global namespace.
Creating a Namespace
Creating a namespace is similar to creation of a class.
namespace MySpace
{
// declarations
}
int main()
{
// main function
}
This will create a new namespace called MySpace, inside which we can put our member declarations.
Rules to create Namespaces
- The namespace definition must be done at global scope, or nested inside another namespace.
- Namespace definition doesn't terminates with a semicolon like in class definition.
- You can use an alias name for your namespace name, for ease of use.
Example for Alias:
namespace StudyTonightDotCom
{
void study();
class Learn
{
// class defintion
};
}
// St is now alias for StudyTonightDotCom
namespace St = StudyTonightDotCom;
- You cannot create instance of namespace.
- There can be unnamed namespaces too. Unnamed namespace is unique for each translation unit. They act exactly like named namespaces.
Example for Unnamed namespace:
namespace
{
class Head
{
// class defintion
};
// another class
class Tail
{
// class defintion
};
int i,j,k;
}
int main()
{
// main function
}
- A namespace definition can be continued and extended over multiple files, they are not redefined or overriden.
For example, below is some header1.h header file, where we define a namespace:
namespace MySpace
{
int x;
void f();
}
We can then include the header1.h header file in some other header2.h header file and add more to an existing namespace:
#include "header1.h";
namespace MySpace
{
int y;
void g();
}
Using a Namespace in C++
There are three ways to use a namespace in program,
- Scope resolution operator (
::
)
- The
using
directive
- The
using
declaration
With Scope resolution operator (::
)
Any name (identifier) declared in a namespace can be explicitly specified using the namespace's name and the scope resolution ::
operator with the identifier.
namespace MySpace
{
class A
{
static int i;
public:
void f();
};
// class name declaration
class B;
//gobal function declaration
void func();
}
// Initializing static class variable
int MySpace::A::i=9;
class MySpace::B
{
int x;
public:
int getdata()
{
cout << x;
}
// Constructor declaration
B();
}
// Constructor definition
MySpace::B::B()
{
x=0;
}
The using
directive
using
keyword allows you to import an entire namespace into your program with a global scope. It can be used to import a namespace into another namespace or any program.
Conside a header file Namespace1.h:
namespace X
{
int x;
class Check
{
int i;
};
}
Including the above namespace header file in Namespace2.h file:
include "Namespace1.h";
namespace Y
{
using namespace X;
Check obj;
int y;
}
We imported the namespace X
into namespace Y
, hence class Check
will now be available in the namespace Y
.
Hence we can write the following program in a separate file, let's say program1.cpp
#include "Namespace2.h";
void test()
{
using Namespace Y;
// creating object of class Check
Check obj2;
}
Hence, the using
directive makes it a lot easier to use namespace, wherever you want.
The using
declaration
When we use using
directive, we import all the names in the namespace and they are available throughout the program, that is they have a global scope.
But with using
declaration, we import one specific name at a time which is available only inside the current scope.
NOTE: The name imported with using
declaration can override the name imported with using
directive
Consider a file Namespace.h:
namespace X
{
void f()
{
cout << "f of X namespace\n";
}
void g()
{
cout << "g of X namespace\n";
}
}
namespace Y
{
void f()
{
cout << "f of Y namespace\n";
}
void g()
{
cout << "g of Y namespace\n";
}
}
Now let's create a new program file with name program2.cpp with below code:
#include "Namespace.h";
void h()
{
using namespace X; // using directive
using Y::f; // using declaration
f(); // calls f() of Y namespace
X::f(); // class f() of X namespace
}
f of Y namespace
f of X namespace
In using declaration, we never mention the argument list of a function while importing it, hence if a namespace has overloaded function, it will lead to ambiguity.