C++命名空间

来源:互联网 发布:手游java服务器端开发 编辑:程序博客网 时间:2024/05/17 06:00

好久没写博客了,现在也开始了C++的学习,最近一个半月非常颓废,没有好好编程,旧的结束,代表着新的开始,大三了,不可蹉跎岁月!!!

今天我们首先从C++最基础的东西开始,大二第一个学期接触过C++,可惜当时学的真是云里雾里,现在自己一步步进行摸索,感觉好多都是恍然大悟的样子。多余的就不多说了,开始今天的学习。

首先我们来讲下命名空间。

命名空间

对于命名空间,这是一个C中没有的东西,首先这里要提出一个问题,为什么会有命名空间呢?

其实这个要归结到C语言的一些缺陷上来说,比如说,在你开发过程当中,多个全局变量重名了,如果在C当中,这是肯定无法编译过去的,所以这里,c++为了解决全局变量命名重名的问题,出现了命名空间。

我们在写C++中经常写的就是这样的一句话:

using namespace std

这句代码其实就是我们对命名空间空间的使用。

在这里的std其实就是一个命名空间。
命名空间可以让我们对不同的重名数据进行使用。

#include<iostream>#include<cstdlib>using namespace std;namespace A{    int a(50);}namespace run{    int a(80);}int main(){    cout << A::a << "--" << run::a << endl;    system("pause");    return 0;}

比如上面这个程序,在C++当中,我们给了两个命名空间 A和run,这两个命名空间中的a就是重名的变量。在这里要说一个运算符,::域运算符,::是运算符中等级最高的。

using呢,其实也是一个关键字,这个关键字起到使用某个命名空间的作用。

using也是含有作用域的。c++是从上往下进行编译的,using的作用域也是从上往下,从using代码开始一直到代码结束,所以我们一般就把using放到上面,这样作用域就最大了。另外,要记住using所使用的命名空间,必须先定义好才行。
比如:

#include<iostream>#include<cstdlib>using namespace std;namespace A{    int a(50);}using namespace run;namespace run{    int a(80);}int main(){    cout << A::a << "--" << run::a << endl;    system("pause");    return 0;}

这样就是不行的,run命名空间必须先定义,再使用。

另外,如果我们是这样进行操作也是不行的。

#include<iostream>#include<cstdlib>using namespace std;namespace A{    int a(50);}namespace run{    int a(80);}using namespace run;using namespace A;int main(){    cout << a << "--" << a << endl;    system("pause");    return 0;}

这样就是对变量重名,会出现不明确的冲突,解决方法就是对各个变量加上各自的命名空间。

没有命名的命名空间可以进行直接的调用。
命名空间可以进行嵌套使用。
命名空间也可以直接进行赋值的。(给命名空间起别名)
例如:

#include<iostream>using namespace std;namespace run{    char *str("atoi");    namespace abc    {        int a(20);    }}namespace r = run;int main(){    cout<<r::str<<endl<<r::abc::a<<endl;} 

扩充命名空间:当命名空间不够,可以在外部进行命名空间的内容的添加。
也就是说命名空间在内部外部都可以进行添加。
例如:

#include<cstdlib>#include<iostream>using namespace std;namespace A{    int a(50);}namespace A{    char *str("atoi");}int main(){    cout << A::a << endl << A::str << endl;    system("pause");    return 0;}

命名空间中尽量不要定义函数,在软件开发的过程当中,当要实现一个功能,当要改代码时,会比较费劲,一般对函数的操作更喜欢使用函数指针,让它指向外部的一个函数。这样代码的可维护性会变得更好。。

例如:

namespace run{    double d(5.9);    int a(50);    int(*add)(int, int);}int add(int a, int b){    return a + b;}

这样,你对函数的功能如果进行修改就不会影响到其他模块。

namespace当中的所有的数据都是公有的。所有数据皆是共有的,不允许有私有的内容。而对于结构体来说默认是共有的。

命名空间与全局变量的差别:

例如:

#include<stdlib.h>#include<stdio.h>int a = 1;int main(){    int a = 3;    printf("%d", a);    system("pause");    return 0;}

运行这一段代码,在C当中,没有办法让a输出1。而c++当中,只需要这样做:

#include<cstdlib>#include<iostream>int a = 1;int main(){    int a = 3;    std::cout<<::a;    system("pause");    return 0;}

C语言当中没有办法引用全局变量。已经被屏蔽了。C出现重名,会无法引用全局变量。
在C++当中就可以使用域运算符,这时候把全局当作了一个域进行引用。

::前面什么都没有一般就是意味这全局。

最后要说其实有没有命名空间其实就是我们看c和c++的区别。

命名空间在软件开发过程当中主要应用于迭代式开发。

2 1