1. 命名空间
在C/C++中,变量、函数和类都是大量存在的,它们的名称都将存在于全局作用域中,可能会导致很多冲突。如下图:
因为time函数在全局作用域中,自己又在全局范围内声明了一个time对象,导致函数名与对象名重名,造成错误
为此产生了命名空间的概念:需要使用namespace关键字,后面接命名空间的名字,然后接一堆{}即可,{}中为命名空间的成员。
#include<iostream> using namespace std; //编译不通过 int time = 1; int main() { cout << "hello world!" << endl; cout << time << endl; return 0; } //错误C2365“time” : 重定义;以前的定义是“函数” #include<iostream> using namespace std; //声明一个命名空间xty,使自己声明的变量在xty作用域,和全局作用域分开,因此 //使用时需要在前面加一个xty::表明去xty命名空间去找 namespace xty { int time = 1; }; int main() { cout << xty::time << endl; return 0; } // 可以运行 //输出为1
编译运行时,如果遇到未知的符号,没有特别的声明时,默认会先到全局作用域去寻找,因此在使用时,尽量声明它所在的作用域。
命名空间如何定义
#include<iostream> using namespace std; //声明一个命名空间xty1 namespace xty { int time = 1; void PRINT() { cout << "xty" << endl; } }; //命名空间可以嵌套定义 namespace ljj { int time = 2; namespace ljj_PRINT { void PRINT() { cout << "ljj" << endl; } }; }; //同一个工程中允许存在多个相同的命名空间,比如a.cpp,b.cpp,a.h,b.h都又相同的命名空间xty //编译器在链接时,会将它们自动合并成一个命名空间xty int main() { // 命名空间的使用 //正常使用 cout << xty::time << endl; xty::PRINT(); //嵌套使用 cout << ljj::time << endl; ljj::ljj_PRINT::PRINT(); return 0; }
命名空间如何使用
例子按上面代码来探究:
- 加命名空间名称+作用域限定符::
int main () { //正常使用 cout << xty::time << endl; xty::PRINT(); return 0; }
- 使用using将命名空间的某个成员引入
// 仅仅将xty中的time成员引入,这样使用time就不用加域作用限定符了 using xty::time int main () { //正常使用 cout << time << endl; xty::PRINT(); return 0; }
- 用using namespace 命名空间名称 引入
// 将整个命名空间展开 //这样就可以不加域作用限定符使用xty下的所用成员 using namespace xty; int main () { //正常使用 cout << time << endl; PRINT(); return 0; }
先在全局作用域中去寻找,如果没有再在展开的命名空间中去寻找
如下例子:
#include<iostream> using namespace std; //声明一个命名空间xty namespace xty { int time = 2; void PRINT() { cout << "xty" << endl; } }; // 展开声明的命名空间 using namespace xty; int main() { cout << ::time << endl; return 0; } // 结果为time函数的地址
因为C++规定所有库函数都需要写在std的命名空间里面,using namespace std 仅仅是把std展开,只是一个命令,仍然需要把库函数头文件引进来!!保证有这个文件了,再将这个文件的std展开,就可以了。
2.缺省参数
缺省参数就是在声明或定义函数时,为函数的参数指定一个缺省值,当调用函数时,如果没有指定该参数,则默认使用缺省值。
#include<iostream> using namespace std; //设置缺省值为10 void Text(int a = 10) { cout << a << endl; } int main() { Text(); //输出结果为10 Text(20); //输出结果为20 return 0; }
2.1 缺省参数分类
2.1.1全缺省参数
所有参数都缺省
#include<iostream> using namespace std; //全缺省参数 void Text(int a = 10, int b = 20, int c = 30) { cout << a << endl; cout << b << endl; cout << c << endl; } int main() { Text(); //输出结果为10,20,30 //参数必须从左往右依次给出 Text(1, 2); //输出结果 1,2 ,30 Text(5); //输出结果5,20,30 //必须从左往右给,传参错误! Text(, 0); return 0; }
2.1.2 半缺省参数
只有部分参数缺省
#include<iostream> using namespace std; //半缺省参数 //缺省参数必须是从右往左连续的! void Text(int a, int b = 2, int c = 3) { cout << a << endl; cout << b << endl; cout << c << endl; } int main() { Text(10); //输出结果为10,2,3 return 0; }
注意:1.缺省参数不能在函数声明和定义同时出现;同时出现时,声明说了算,要将定义处缺省删去。2.缺省值必须是常量或者是全局变量
3. 函数重载
C++允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似但数据不同任务。
#include<iostream> using namespace std; // 函数重载 int Add(int x, int y) { return x + y; } //1. 参数类型不同 double Add(double x, double y) { return x + y; } //2.参数数量不同 int Add(int x, int y, int z) { return x + y + z; } // 3.参数类型顺序不同 int Add(int x, double y, int z) { return x + y + z; } int Add(int x, int y, double z) { return x + y + z; } int main() { //感觉调用了一个函数一样,但是传进去了不同的数据类型 //完成了不同的加法任务 Add(1, 2); Add(1.11, 2.22); Add(1, 2, 3.33); return 0; }
key:只有参数类型或参数顺序或参数个数不同才构成重载,返回值不同不构成重载!!!
4. 引用
引用就是给一个变量取别名。
使用符号&
类型& 引用变量名(对象名)= 引用实体
引用的类型必须和引用实体的类型相同
int main() { int x = 10; //引用必须在声明的时候初始化,即声明的时候就得指出要给谁起别名。 // int& y; int& y = x; cout << x << endl; cout << y << endl; //结果都是10 return 0; }
引用特性:1.引用一旦声明就必须初始化;2.一个变量可以有多个引用(一个变量可以有多个别名);3.引用一旦引用一个实体,就不能在引用其他实体
C++基础-命名空间-缺省参数-函数重载-引用-内联-auto-范围for(2):https://developer.aliyun.com/article/1390543?spm=a2c6h.13148508.setting.17.3f514f0espVkau