crazybird

C++中的“命名空间”

0
阅读(1108)

命名空间主要解决命名冲突的问题。命名空间可以存放类、对象、函数、变量、结构体等。假如要使用命名空间中的变量或者对象,那么使用using namespace来指定某个命名空间,释放该命名空间中所有的变量或对象等。如果不想将它们全部从命名空间中释放出来,而是只使用该空间中某个特定的变量,那么使用命名空间加作用域解析符::指定该变量。如:#include<iostream>

using namespace std;              //  释放std命名空间所有变量、函数等
namespace people
{
    char name[10]="Jack";
}
int main()
{
    cout << "name:" << people::name << endl;
    getchar();                   //  等待键盘输入字符
    return 0;
}

关于全局变量和局部变量的使用,如:

#include<iostream>
using namespace std;
int x = 1;          //  定义一个int型的全局变量x
int main()
{
    int x = 2;      //  定义一个int型的局部变量x
    cout << "输出全局变量:x=" << ::x << endl;  //  引用全局变量时使用作用域解析符::
    cout << "输出局部变量:x=" << x << endl;
    getchar();      //  等待键盘输入字符
    return 0;
}

创建命名空间时需要注意一些细节:

(1)同一个命名空间可以多次重复创建,以扩充命名空间的内容。

#include<iostream>
using namespace std;
namespace people
{
    char name[10] = "Jack";
}
namespace people
{
    int age = 18;
}
int main()
{
    cout << "name:" << people::name << endl;
    cout << "age:" << people::age << endl;
    getchar();      //  等待键盘输入字符
    return 0;
}

(2)尽量在命名空间之外定义函数,命名空间内只做函数声明。这样做有两个好处:第一,保持命名空间的整洁性;第二,有利于将命名空间专门存放于头文件中,而将函数的定义部分存放于实现文件中。

#include<iostream>
using namespace std;
namespace func
{
    void display();
}
int main()
{
    func::display();
    getchar();
    return 0;
}
void func::display()
{
    cout << "hello C++!!!" << endl;
}

(3)命名空间中的成员都是公有的,不能将它们私有化。并且只能以创建命名空间的方式添加新成员,而不能像定义对象或使用限定符的方式定义新成员。以下几种情况是错误:

namespace func
{
    private:
        void display(){cout << "Hello OpenCV" << endl;}
}
func x;
int func::x;

(4)一个命名空间可以嵌套在另一个命名空间。

如果只是想释放命名空间中的某些变量,可以这么做:

#include<iostream>
using namespace std;
namespace num1
{
    int x = 10;
    int y = 20;
}
namespace num2
{
    int x = 30;
    int y = 40;
}
int main()
{
    using num1::x;
    using num2::y;
    cout << "x=" << x << " y=" << y << endl;
    getchar();
    return 0;
}

可以为命名空间取个别名,如:

namespace people
{
    char name[10] = "Jack";
}
namespace person = people;