c++ 作用域和名字控制
一、::(双冒号) 作用域
<::>运算符是一个作用域如果<::>前面什么都没有加 代表是全局作用域
二、命名空间(namespace)
1、namespace
本质是作用域,可以更好的控制标识符的作用域命名空间 就可以存放 变量 函数 类 结构体 …
2、命名空间的使用
1、命令空间的定义:必须定义在全局范围
2、命名空间下可以存放 变量函数 结构体 类
3、命名空间可以重名 重名的命名空间相当于做合并4、操作命名空间可以嵌套命名空间
5、命名空间可以取别名
6、命名空间可以没有名字
7、命名空间中的函数可以先声明,在外部定义。定义时需要加上命名空间作用域
#include <iostream>
using namespace std;namespace A
{int a = 10;void fun(){cout << "hello namespace" << endl;}void function(int val);
}
void A :: function(int val){cout << "hello function" <<endl;
}
namespace B
{int a = 10;int b = 20;
}
namespace C
{int a = 20;namespace D{int a = 10;}
}void print(){cout << "namespaceA a = " << A :: a <<endl;cout << "namespaceB a = " << B :: a << endl;cout << "namespaceB b = " << B :: b << endl;A :: fun();cout << "namespaceD a = " << C :: D :: a << endl;
}int main(){print();
}
3、无名字的命名空间
如果命名空间没有名字那么这个命名空间内的所有成员都被编译器加上了static修饰
只能被当前文件调用 这个属于内部链接属性
namespace{
int a=10:
void func(){cout << "hello namespace" << endl:}
4、命名空间取别名
namespace newname = oldname;
三、using声明和using编译指令
1、using声明:
如果在某个空间内的变量过对象或函数要频繁的访问,不想次次都要加上::(双冒号作用域)时就可以用到using声明。
#include <iostream>
using namespace std;
namespace A
{int a = 100;void index(){cout << "hello" << endl;}
}void fun(){
//多次访问A下面的a旧的加上作用域::cout << A :: a << endl;cout << A :: a << endl;cout << A :: a << endl;//那可以用using来声明解决不要每次都要写这个作用域using A ::a;cout << a << endl;cout << a << endl;cout << a << endl;index();
}int main(){return 0
}
注意:当using声明的标识符和其他标识符有作用域的冲突时,会产生二义性
void fun(){int a = 10;//errusing A ::a;cout << a << endl;cout << a << endl;cout << a << endl;
}
2、using编译指令:
使得整个命名空间标识符可用。
namespace nameA
{int a = 10;void fun(){cout << "hello" << endl;}
}void function(){int a = 100;//如果在using编译指令前也一个相同的变量,就不会像using声明一样有冲突。using namespace nameA;//此时a的值是局部变量的值100cout << a << endl;fun();
}
建议用using编译指令取代using声明来使用。