一、C++关键字
二、命名空间
使用命名空间使得用户自定义变量名和关键字和库隔离,这就是“#include <iostream>
using namespace std;”的原因。
访问变量时优先访问局部变量再是全局域,并在这一过程中不会自动去命名空间检索变量(一般不会使用展开命名空间,否则可能会导致歧义),使用“::”域作用限定域指定访问一个域的变量形式位“域::变量名”,(域为空时表示全局域),所以可以使用域作用限定符去指定访问一个命名空间的变量。
展开命名空间:自动检索时要去命名空间检索。
命名空间可以嵌套使用,同理可以嵌套使用域作用限定符。
三、C++输入&输出
使用头文件iostream,cout<<"XXXXXX";
由于C++兼容C,可以直接使用C的输入输出。
四、缺省参数
传参只能从左往右传参。
在头文件中,在函数声明和函数定义时不能同时给缺省参数赋值,只能声明的时候给缺省参数。
五、函数重载
函数重载是函数的一种特殊情况,C++允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型或类型顺序)不同,才称为函数重载。
C++支持函数重载的原理为:这一过程涉及预处理->编译->汇编->链接
预处理:展开头文件/宏替换/条件编译/去注释/.... ,生成xxxx.i 文件
编译:检查语法,生成汇编代码,生成xxxx.i文件
汇编:生成二进制机器码
链接:将机器码合并,生成可执文件
C++在函数重载时,是在链接时是生成重载函数的地址,符号表中表项(键值包含函数名和参数的综合键值)不同即不同函数对应的地址是不同的。而C中的符号表只将函数名作为符号表的键值,所以不允许同名。所以C++中同名函数的形参列表(参数个数、类型或类型顺序)不同才可以。
六、引用
C++对于C中的指针创新了一种新方法。引用不是定义一个变量,而时给已存变量取了一个别名,编译器为引用变量开辟内存变量,它和它的引用的变量共用一块存储空间。
别名一经确定就不会改变,但是可以对别名进行赋值
引用的应用场景:
1、做参数(形参的改变影响实参)
2、引用做返回值,引用做返回值时,不会拷贝返回值,如果返回时函数栈帧销毁,引用的值会变为随机值(使用的时候注意函数栈帧改变会导致别名改变)
综上,基本任何场景都可以用引用传参;谨慎使用引用传参。
引用权限:
引用过程中,权限不能放大,但是可以变小
七、构造函数
构造函数是特殊的成员函数,作用是初始化对象。
特征如下:1、函数名和类名相同
2、无返回值
3、构造函数可以重载
4、自动调用
5、如果没有显式定义构造函数,会自动生成(一般构造函数都是需要自己写)
6、构造函数默认只有一个
八、析构函数
1、析构函数前有符号~
2、无参数无返回类型
3、不允许重载。一个类只会有一个析构函数,默认生成的析构不会作用,自定义类型成员变量会使用自己的析构函数。
4、对象生命周期结束时,C++编译系统自动调用析构函数
九、拷贝构造
C++规定,内置类型直接拷贝,自定义类型必须调用拷贝构造
1、拷贝构造的参数只有一个,参数只能使用引用(也可使用指针),否则会导致无穷递归
2、若为显式拷贝构造,编译器会生成默认的拷贝构造(内置类型成员完成值拷贝,自定义类型成员会调用它的拷贝构造)
十、运算符重载
operator
为了增加代码的可读性,运算符重载是具有特殊函数名的函数。
函数名为:opertor后面接需要重载的符号。
1、不能通过连接其他符号来创建新的操作符,如operator@
2、重载操作符必须有一个类型参数
3、对如内置类型的运算符,其意义不能改变
4、作为类成员函数重载时,其形参看起来比操作数数目少一,另一个为隐藏this
5、.* :: sizeof ?: . 这五个运算符不能重载
默认成员函数都不能写为全局。
可以直接支持内置类型是库里面实现了,可以直接支持自定义类型是因为函数重载。
重载默认占用第一个参数,就做了左操作数。