对于C++笔记的一些温习内容.
关键字: namespace: 解决命名冲突,是c++中一种新的作用域;
//1.普通命名空间 namespace N1 { int a = 10; int Add(int left,int right) { return left+right; } } //2.嵌套 namespace N2 { int a = 20; int Sub(int left,int right) { return left-right; } namespace N3 { int a = 30; int b = 20; int Mul(int left,int right) { return left*right; } } } //同一个工程中,可以定义多个相同名称的命名空间 //编译器会将多个相同名称的命名空间合并成一个,如果有相同的会重定义报错 namespace N1 { int c = 0; int d = 0; int Div(int left,int right) { if(0 == right) exit(0); return left/right; } } int a = 50; //使用成员 //方式一: 命名空间名字::成员名字 //方式二: using 命名空间名字::成员名字 // 场景 : 当前命名空间中个别成员多次在某个文件中被使用 // 缺陷 : 可能会和全局造成命名冲突 //方式三: using namespace 命名空间名字 // 场景 : 当前命名空间中多个成员多次在某个文件中被使用 // 缺陷 : 冲突率比较高 using N1::a; using namespace N1; int main() { int a = 60; printf("%d ",a); //局部 printf("%d ",::a); //全局 printf("%d ",N1::a); //namespace N1 return 0; }
缺省参数: 缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参
1.最好放在声明位置
2.必须是常量或者全局变量
3.半缺省参数必须从右往左依次来给出,不能间隔
4.C语言不支持
//缺省参数分类 //1.全缺省参数 : 实参想给几个给几个,从左往右传值 void Func1(int a=2,int b=3,int c=4); //2.半缺省参数 : 只能从右往左依次给出缺省参数,不能跳着给 // 从左往右传值 void Func2(int a,int b=3,int c=4);
函数重载: 名称相同,参数列表不同的函数,与返回值无关,需在同一作用域
原理: 名字修饰规则,编译器底层为重新修饰后的名称,包含作用域,函数名,参数类型等
引用: 变量的别名,与引用的变量共用同一块内存空间
语法: 必须初始化
应用: 相当于替代了指针,传参,传返回值
底层: 引用就是指针 T& == T * const
内联函数: inline修饰的函数,更安全的替代宏函数
在编译器编译阶段,用函数体替换函数调用的位置,少了函数调用参数压栈以及栈帧创建的时间开销,提高了代码的运行效率
特性: 1.空间换时间的做法,适合短小的代码
2.对编译器来说只是一个建议
3.不建议内联函数声明和定义分离,容易导致链接错误
auto: 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将
auto替换为变量实际的类型。
auto使用细则 :
1.用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
2.当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
auto不能使用的场景 :
1. auto不能作为函数的参数
2. auto不能直接用来声明数组(因为数组只有&和sizeof里才是数组,其他时候会退化成指针)
3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
4. auto在实际中最常见的优势用法就是跟C++11提供的新式for循环,还有lambda表达式等进行配合使用
关键字 nullptr: 因为C语言NULL是宏,所以可能会出错,由此引入更安全的nullptr.
c++把NULL、0视为同一种东西,有些编译器将NULL定义为 ((void*)0),有些将其定义为0.
c++不允许直接将void*隐式的转化为其他类型,但是如果NULL被定义为 ((void*)0),
当编译char *p = NULL;
NULL只好被定义为0。
还有:
void func(int);
void func(char*);
如果NULL被定义为0,func(NULL)会去调用void func(int),这是不合理的
所以引入nullptr,专门用来区分0、NULL。
nullptr的类型为nullptr_t,能够隐式的转换为任何指针。
所以用空指针就尽可能的使用nullptr。