C++ 基础知识
一、命名空间
- 目的:解决命名冲突的问题。
- 特点:命名空间可以嵌套使用,在命名空间内定义的常量、变量、函数、结构体、类、模板、命名空间,在使用他们时需要加上作用域限定符。
1.1 匿名命名空间
- 作用:该空间中的实体,其它文件无法引用,它只能在本文件的作用域内有效,它的作用域是从匿名命名空间声明开始到本文件结束。在本文件使用无名命名空间成员时不必用命名空间限定。其实匿名命名空间和static是同样的道理,都是只在本文件内有效,无法被其它文件引用。
二、const关键字
- 特点:相比宏定义的常量:
- ①宏定义在预处理阶段展开,做字符串替换;而const常量实在编译时。
- ②类型和安全检查不同。宏定义没有类型,不做任何类型检查;const常量有具体的类型,在编译期会执行类型检查。
2.1 使用const关键字修饰指针
- 常量指针:例:int* const p1;
- 指针常量:例:const int * p1;
- 常量指针常量:例:const int * const p1;
三、new/delete 表达式
3.1 使用new开辟空间
1. 调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象
2. 运行该类型的一个构造函数初始化对象
3. 返回指向新分配并构造的构造函数对象的指针
3.2 使用delete销毁空间
1. 调用析构函数,回收对象中数据成员所申请的资源
2. 调用名为operator delete的标准库函数释放该对象所用的内存
四、 引用
- 格式:类型 & 引用名 = 目标变量名
- 引用可以看作变量的别名
4.1 引用的本质
- C++中的引用本质上是一种被限制的指针。引用变量会占据存储空间,存放的是一个地址,但是编译器阻止对它本身的任何访问,从一而终总是指向初始的目标单元。在汇编里,引用的本质就是“间接寻址”。
4.2 引用作为值传递时
- 当用引用作为函数的参数时,其效果和用指针作为函数参数的效果相当。当调用函数时,函数中的形参就会被当成实参变量或对象的一个别名来使用,也就是说此时函数中对形参的各种操作实际上是对实参本身进行操作,而非简单的将实参变量或对象的值拷贝给形参。
4.3 引用作为函数返回值时
- 必须遵守以下规则:
1. 不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为
了"无所指"的引用,程序会进入未知状态。
2. 不能在函数内部返回new分配的堆空间变量的引用。如果返回的引用只是作为一个临时变量出现,
而没有被赋予一个实际的变量,那么该引用所在的空间就无法释放,会造成内存泄漏。
4.4 总结
1. 在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递
中,解决大块数据或对象的传递效率和空间不如意的问题。
2. 用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,
保证了引用传递的安全性。
3. 引用与指针的区别是,指针通过某个指针变量指向一个变量后,对它所指向的变量间接操作。程序
中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的
操作。
五、C++强制转换
5.1 static_cast
- 常用用法
1)用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开
发人员来保证。
2)把void指针转换成目标类型的指针,但不安全。
3)把任何类型的表达式转换成void类型。
4)用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成
基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类
型检查,所以是不安全的。
5.2 const_cast
- 常用用法
该运算符用来修改类型的const属性。常量指针被转化成非常量指针,并且仍然指向原来的对象;常量
引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
5.3 dynamic_cast
该运算符主要用于基类和派生类间的转换,尤其是向下转型的用法中。
5.4 reinterpret_cast
该运算符可以用来处理无关类型之间的转换,即用在任意指针(或引用)类型之间的转换,以及指针与
足够大的整数类型之间的转换。由此可以看出,reinterpret_cast的效果很强大,但错误的使用
reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正
确使用reinterpret_cast方式。
六、函数重载
1. 函数名称必须相同 。
2. 参数列表必须不同(参数的类型不同、个数不同、顺序不同)。
3. 函数的返回类型可以相同也可以不相同。
4. 仅仅返回类型不同不足以成为函数的重载。
七、默认参数
7.1 默认参数的声明
- 一般将默认参数在函数声明中提出。
7.2 默认参数的顺序规定 - 如果一个函数中有多个默认参数,则形参分布中,默认参数应从右至左逐渐定义。
八、bool类型
- bool类型,用来表示true和false。任何数字或指针值都可以隐式转换为bool值。任何非零值都将转换为true,而零值转换为false。
九、inline函数
- 在调用一个类联函数时,编译器首先检查调用是否正确。如果正确,内联函数的代码就会直接替换函数调用语句,于是省去了函数调用的开销。
9.1 将内联函数放入头文件
关键字inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。