命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字 C++初阶

命名空间概述在C/C++中 , 变量、函数和后面要学到的类都是大量存在的 , 这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突 。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的 。
举个例子:
#include <stdio.h>#include <stdlib.h>int rand = 10;int main(){ printf("%d", rand); return 0;}程序编译的结果显示rand重定义了,为什么会这样呢?因为在stdlib.h这个头文件中已经定义了rand这样一个函数,这样就导致了编译器不知道这是一个函数还是一个变量,C语言中无法应对这种冲突,只能通过改名字来避免 。

命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字 C++初阶

文章插图
而C++为了解决这个问题,引入了命名空间的概念 。
命名空间的定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员 。
//命名空间//A就是命名空间的名字namespace A{ int a; void func() {}}注意事项:
  • 命名空间只能写在全局
  • 命名空间可以嵌套命名空间
  • 命名空间是开放的,随时可以加入新的成员 , 但是新加入的成员只能在加入后使用
  • 匿名命名空间就类似于static
  • 命名空间可以取别名
  • 分文件编写的时候,如果头文件有两个命名空间,但是里面的成员函数或者成员变量同名的时候,在cpp重实现函数需要加上命名空间
接下来给一个完整的代码块来展示命名空间的注意事项和使用:
#include<iostream> //引入头文件#include<string>//C++中的字符串using namespace std; //标准命名空间//A就是命名空间的名字namespace A{ //命名空间内既可以定义变量也可以定义函数 int rand = 10; int Sub(int x, int y) {return x + y; } struct ListNode {int data;struct ListNode* next; };}//命名空间的嵌套定义namespace B{ int rand; namespace C {int rand; }}//命名空间是开放的,随时可以加入新成员,但是新成员只能在加入后使用namespace B{ int c;//此时c会合并到命名空间B中 , 实际上就是个合并的过程}//匿名命名空间namespace{ int d = 5;//命名空间没有名字,就类似于static int d = 50 , 是个静态全局变量,别的文件无法使用}int main(){ //命名空间的使用 //1.::作用域限定符 //访问A空间的Sub函数 cout << A::Sub(10, 20) << endl; //2.访问嵌套空间 //访问B空间的C空间的rand变量 B::C::rand = 5; cout << B::C::rand << endl; system("pause"); return EXIT_SUCCESS;}using关键字引入using关键字之后,命名空间的使用又变得不一样
  • 用using将命名空间的成员引入
namespace A{ int a = 10;}void test01(){ //using声明的意思就是让命名空间中某个标识符可以直接使用 using A::a; cout<<a<<endl;}注意:
1.使用using声明,就不会每次写A::a了,直接用a就可以
2.using A::a声明的意思就是把变量a又在test函数中定义了一次,此时如果在test内部再定义一个int a;就会出错
  • 用using namespace 命名空间名称引入
namespace A{ int a = 10;}using namespace A;void test01(){ cout<<a<<endl;}使用using关键字修饰namespace整个命名空间,实际上就是脱去了这个命名空间的外衣,就等价于你定义了一个int a在全局
思考一个问题:下面代码有错吗?
在test01函数体内又定义了一个int a,会报错么?如果不报错,那么输出的是全局的 a = 10 还是局部的a  = 20?
namespace A{ int a = 10;}using namespace A;void test01(){ int a = 20; cout<<a<<endl;}答案是不会报错,输出的是局部的20,因为命名空间A内部的变量a在使用using关键字后相当于在全局定义了一个int a ;而在函数体内定义一个局部的 int a;两个变量的作用域不同,是可以定义同名变量的 , 输出的是局部变量的值 , 小伙伴的要注意区分~
C++输入和输出