主题:C++中你不知道的namespace和using的用法
来自:莫浅子
引言
你是不是只认为namespace 和 using 在C++中是基本的语法框架,但是却不知道它们的真正用法,看完文章你会对using和namespace有一定了解,帮助你深入学习C++
一: 冒号作用域
:: 运算符是一个作用域,如果::前面什么都没有加 代表是全局作用域
也就是如果你输入的数前加了:: 代表是全局变量
代码
#include <iostream> using namespace std; int a = 100; void test01() { int a = 10; cout << a << endl; //打印局部变量 cout << ::a << endl; //打印全局变量 } int main() { test01(); return 0; }
最后结果
10
100
二、名字控制
1 命令空间
namespace 本质是作用域,可以更好的控制标识符的作用域
命名空间 就可以存放 变量 函数 类 结构体 ...
2 命令空间的使用
1)命令空间的定义 必须定义在全局范围
2)命名空间下可以存放 变量 函数 结构体 类
namespace A { int a = 1; void fun() { cout << "hello namespace" << endl; } void foo(int agr); struct std //结构体 {}; class obj //类 {}; }
3)命名空间可以重名 重名的命名空间相当于做合并操作
namespace B { int a = 10; int b = 20; } //命名空间可以重名 namespace B { int c = 100; }
4)命名空间可以嵌套命名空间
//命名空间可以嵌套 namespace C { int a = 10; int b = 20; namespace D { int a = 100; } }
void test02() { cout << C::a << endl; cout << C::D::a << endl; }
5)命名空间可以取别名, namespace newname = oldname;新名字与旧名字有同等效益
namespace NewA = A;
6)命名空间可以没有名字 ,没有名字相当于给命名空间 内的所有成员加上了static修饰
相当于只能被当前文件调用,属于内部链接属性
namespace { int a = 10; void func() { cout << "hello namespace" << endl; } }
7)命名空间中的函数可以先声明,在外部定义,定义时需要加上命名空间作用域
namespace A { void foo(int agr); } void A::foo(int arg) { cout << arg << endl; } void test03() { A::foo(222); }
总的代码
#include <iostream> using namespace std; // 命令空间的定义 必须定义在全局范围 // 命名空间下可以存放 变量 函数 结构体 类 // 命名空间可以重名 重名的命名空间相当于合并操作 // 命名空间可以嵌套命令空间 namespace A { int a = 1; void fun() { cout << "hello namespace" << endl; } void foo(int agr); struct std //结构体 {}; class obj //类 {}; } //与A作用域下定义不一样,这个在全局作用域下 void A::foo(int arg) { cout << arg << endl; } namespace NewA = A; //命名空间是可以取别名 // namespace newname = oldname namespace B { int a = 10; int b = 20; } //命名空间可以重名 namespace B { int c = 100; } //命名空间可以嵌套 namespace C { int a = 10; int b = 20; namespace D { int a = 100; } } void test01() { cout << A::a << endl; cout << B::a << endl; cout << B::b << endl; cout << B::c << endl; A::fun(); //表示A空间中fun函数调用 } void test02() { cout << C::a << endl; cout << C::D::a << endl; } void test03() { A::foo(222); } namespace { int a = 10; void func() { cout << "hello namespace" << endl; } } int main() { test01(); test02(); test03(); return 0; }顺便吆喝一下,技术大厂,前后端测试捞人,来看看!
三、 using的指令
1 using的声明
usinng 的声明可以使得指定标识符可用
注意: 当using声明的标识符和其他同名标识符有作用域的冲突时,会产生二义性
namespace nameA { int a = 10; void foo() { cout << "Hello using" << endl; } } void test01() { //注意当using指定声明标识符和其他标识符作用域有作用域的冲突时,会产生二义性 //int a = 100 using nameA::a; using nameA::foo; cout << nameA::a << endl; cout << a << endl; foo(); }
2 using的编译指令
void test02() { int a = 1000; // using编译指令使整个命名空间标识符可用 using namespace nameA; cout << a << endl; //结果为1000,就近原则 foo(); }
总结代码
#include <iostream> using namespace std; namespace nameA { int a = 10; void foo() { cout << "Hello using" << endl; } } void test01() { //注意当using指定声明标识符和其他标识符作用域有作用域的冲突时,会产生二义性 //int a = 100 using nameA::a; using nameA::foo; cout << nameA::a << endl; cout << a << endl; foo(); } void test02() { int a = 1000; // using编译指令使整个命名空间标识符可用 using namespace nameA; cout << a << endl; //结果为1000,就近原则 foo(); } int main() { test01(); test02(); }
输出