Loading... ## 一、冒号作用域 <div class="tip inlineBlock success"> ::运算是一个作用域,如果::前面什么也没有加 代表是全局变量作用域 </div> ```C++ #include<iostream> using namespace std; int a = 100; int main(void) { int a = 10; cout << a << endl; //输出局部变量a cout << ::a << endl; //输出全局变量a return 0; } ```  ## 二、命名空间 <div class="tip inlineBlock success"> namespace:本质是作用域,可以更好的控制标识符的作用域 1.命名空间 就可以存放 变量 函数 结构体... 2.命名空间的定义 必须定义在全局变量 3.命名空间可以重名 相当于合并操作 4.命名空间可以嵌套命名空间 5.命名空间是可以取别名的(不用typedef) //namespace newname = oldname; 6.命名空间可以没有名字 :相当于给命名空间内的所有成员加上了statrc修饰 7.命名空间中的函数可以先声明在定义外部,定义时需要加上命名作用域 </div> <div class="tip inlineBlock error"> 注意:如果命名空间如果没有取名字, 那么这个命名空间内的所有成员都被编译器加数statrc修饰 只能被当前文件调用 这个属于内部链接属性 </div> ```C++ #include<iostream> using namespace std; //命名空间的定义 必须定义在全局变量 namespace A { int a = 10; } namespace B { int a = 20; int b = 20; } //A 和 B 都是一个命名空间 int main(int argc, char* argv[]) { int a = 6, b = 7; cout << a << endl; cout << b << endl; cout << A::a << endl; cout << B::a << endl; cout << B::a << endl; return 0; } ```  * 除了变量,命名空间,还可以存放 变量 函数 结构体... ```C++ #include<iostream> using namespace std; namespace A { struct std { int a; }; } int main(int argc, char* argv[]) { A::std data; data.a = 10; cout << data.a << endl; return 0; } ```  * 命名空间可以重名 相当于合并操作 ```C++ #include<iostream> using namespace std; namespace A { int a = 10; } namespace A { int b = 20; } int main(int argc, char* argv[]) { cout << A::a << endl; cout << A::b << endl; return 0; } ```  函数: ```C++ #include<iostream> using namespace std; void fun() { cout << "hell blog.fivk.cn" << endl;; } namespace A { void fun() { cout << "hell namespace" << endl; } } int main(int argc, char* argv[]) { fun(); A::fun(); } ```  * 命名空间可以嵌套命名空间 ```C++ #include<iostream> using namespace std; namespace A { int a = 10; namespace B { int a = 20; } } int main(int argc, char* argv[]) { cout << A::a << endl; //意义是A空间里面的a cout << A::B::a << endl; //意义是A空间里面的B空间里面的a return 0; } ```  * 命名空间是可以取别名的 ```C++ #include<iostream> using namespace std; namespace A { int a = 10; } int main(int argc, char* argv[]) { namespace newA = A; cout << newA::a << endl; cout << A::a << endl; } ```  ## using的声明 我们在刚了解c++的时候,我们就知道有 using 现在让我们来了解一下。 <div class="tip inlineBlock success"> using的声明可以使得指定标识符可用 </div> 说人话就是我们声明using后,使用不需要添加::来引用空间 ```C++ #include<iostream> using namespace std; namespace nameA { int a = 10; void Fivk() { cout << "hello blog.fivk.cn" << endl; } } int main(void) { using nameA::a; //我们声明了a来自nameA空间 using nameA::Fivk; //我们声明可Fivk来自nameA空间 cout << nameA::a << endl; cout << a << endl; //这两个a现在都是一样的 nameA::Fivk(); Fivk(); //这两个函数是一样的 return 0; } ```  <div class="tip inlineBlock warning"> 注意:当using声明的标识符和其他表示符有作用域的冲突时,会产生二义性,会报错。  </div> ## using的编译指令 <div class="tip inlineBlock success"> using编译指令使整个命名空间标识符可用. </div> 就是不需要一个一个一个的取申请某个命名空间的某个成员了。 ```C++ #include<iostream> using namespace std; namespace nameA { int a = 10; void Fivk() { cout << "hello blog.fivk.cn" << endl; } } int main(void) { using namespace nameA; //现在nameA的所有标识符都是可用的 cout << nameA::a << endl; nameA::Fivk(); return 0; } ```  <div class="tip inlineBlock info"> using 编译指令 不会产生二义性,优先使用原空间定义的标识符 (可以理解位就近原则) ```C++ #include<iostream> using namespace std; namespace nameA { int a = 10; void Fivk() { cout << "hello blog.fivk.cn" << endl; } } int main(void) { int a = 1000; using namespace nameA; cout << a << endl; Fivk(); return 0; } ```  </div> 在这里我还是建议大家用using的编译指令,因为: 1. 声明一次,可以使用命名空间里面的所有成员 2. 可以避免二义性,优先使用局部变量。 如果没有命名空间using编译指令, 那我们就需要 std::cout<<"hello world"<<endl; qvq ## 命名空间使用的注意事项 当两块命名空间都定义了using编译指令,并且两块空间都有相同的标识符,那么访问时就会报错。这个时候我们输出就需要明确引用的空间了。 ```C++ #include<iostream> using namespace std; namespace nameA { int a = 10; } namespace nameB { int a = 1000; } int main(void) { using namespace nameA; using namespace nameB; cout << a << endl; return 0; } ``` <div class='album_block'> [album type="photos"]   [/album] </div> 最后修改:2021 年 04 月 07 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏