C++命名空间
1.概述
在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。
因此:命名空间的出现就是为了解决名称冲突问题
2.格式
1
2
3
4
5
6
7
|
namespace 空间名称 { 变量名称 ..... 函数声明 ..... } |
3.定义范围
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream> using namespace std; namespace test#这是正确的命名形式 { ..... } int main() { namespace test01 #这是错误的命名形式 { } .... } |
结论:命名空间只能在全局范围内定义
4.瀑布式开发格式
命名空间名称相同就是同一个命名空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream> using namespace std; namespace test { .... } namespace test #名称相同就是同一个命名空间 { ....... } int main() { ........ } |
5.命名空间的访问方式
5.1空间名::变量名
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <iostream> using namespace std; namespace test { int a = 10; } int main() { cout << test::a<<endl; ..... } |
5.2using namespace 空间名
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream> using namespace std; namespace test { int a = 10; } using namespace test;#需要在命名空间定义之后 int main() { cout <<a<<endl; ..... } |
需要注意的是:
在使用该语法时,需要在命名空间定义之后,否则会提示找不到。
6.命名空间可以无限嵌套
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include <iostream> using namespace std; namespace test01 { namespace test02 { namespace test { int a = 10; } } } using namespace test01::test02::test;#如果采用第二种方式的话就需要这样声明 int main() { cout << a << endl; } |
7.权限
命名空间不存在私有的概念,都是共有的。
这个也很好理解,因为命名空间的出现就是为了解决名称冲突的问题。仅仅只是解决这个问题而已。
8.匿名命名空间
原则上禁止使用匿名命名空间,出现匿名命名空间这总机制就是为了解决名称冲突
在了解上面的基础之上,我们再来讲述下面的语法规则
匿名命名空间中定义的变量等同于全局变量,但是再背显式调用的时候,使用原生全局变量
相信大家看到这句话会觉得很绝望,但是呢,编程就是这样,直接看代码就对了。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream> using namespace std; int a = 10; namespace #这就是匿名命名空间 { int a = 20; } int main() { cout << a <<endl; ..... } |
大家猜一下,上面的结果是什么?是10 还是 20
结果是编译不通过!!!提示是:变量a是不明确的符号
正如上面所说,匿名空间中定义的变量等同于全局变量,那不就相当于定义了两个相同名称的全局变量。那不就重定义了吗
Attention:C++中不存在变量的定义和声明
如果要想引用全局变量,那就是如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream> using namespace std; int a = 10; namespace #这就是匿名命名空间 { int a = 20; } int main() { cout << ::a <<endl; ..... } |
大家猜一下,上面的结果是什么?是10还是20
结果是10!!!
正如上面所说,如果变量a被调用,则被调用的是原生全局变量,那就是10。
我们说了,匿名命名空间中定义的变量就相当于全局变量,意味着如果没有定义原生全局变量,那么就可以像调用原生全局变量一样调用匿名空间中的全局变量。
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <iostream> using namespace std; namespace #这就是匿名命名空间 { int a = 20; } int main() { cout << a <<endl; #调用原生全局变量的方式 ..... } |
9.别名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream> using namespace std; int a = 10; namespace test { int a = 20; } namespace alise_test = test;#这就是给命名空间 int main() { cout << ::a <<endl; ..... } |
原则上是不推荐给标准命名空间起别名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream> using namespace std; int a = 10; namespace test { int a = 20; } namespace alise_std = std;#这是不建议的一种做法 int main() { cout << ::a <<endl; ..... } |
10.编程模型
使用命名空间的时候,最好还是遵循某种格式。不遵循这种方式也是可以的,对于我而言,准许某种框架的目的在于简便自己编码。
1
2
3
4
5
6
7
8
9
|
namespace test { int a = 0;#变量名的定义 int add( int a , int b ); } int test::add( int a , int b ) { return a+b; } |
PS:命名空间中存放的是变量初始化、函数的声明、类的声明等等,而函数的定义
11.using语法使用
using namespace 空间名;
这个语句可以在程序中的任何一个地方使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream> using namespace std; namespace test { int a = 20; } using namespace test; #test命名空间中的符号的作用域在该语句之后,该源文件之前 void hello( void ) { using namespace test;#test命名空间中的符号的作用域在该语句之后,函数体之前 } int main() { cout << a <<endl; ..... } |
Attention:如果没有引用,命名空间里的代码块就不会被编译
如果命名空间中有大量的符号,采用上面一种方法就不太妥当,因为实际使用到的符号也就那么几个。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream> using namespace std; namespace test { int a = 20; } using namespace test::a; #只使用test命名空间中的a变量 int main() { cout << a <<endl; ..... } |
到此这篇关于详情介绍C++之命名空间的文章就介绍到这了,更多相关C++命名空间内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qq_46359697/article/details/120071452