auto:用auto声明变量的类型,由编译器去自动分析表达式的类型,推断出变量的实际类型。定义auto变量必须有初始值。
decltype:选择并返回操作数的类型,编译器会分析表达式的类型,并不真正计算表达式的值。例如decltype(x) Y;Y的类型为x的类型。decltype(f()) y = sum; y的类型是函数f()的返回值类型
range-for是一种简化的for语句,从头至尾对容器或序列的所有元素逐个执行某种操作。
语法形式为:for( declaration : expression ) statement;
expression是要处理的序列(初始值列表、数组、vector或string等类型的对象),declaration定义一个变量,表示序列中的每个元素,statement是一条语句或语句块,表示对元素的处理代码。在范围for语句块内不能改变正在遍历的序列的大小。
指针
定义:类型 指针变量;
如果指针指向一个对象,则可以通过指针间接访该对象,使用指针解引用运算符“”
指针值为0时是一个空指针,即不指向任何对象的指针。生成空指针的3种方法:
int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;
C++通过new和delete运算符进行动态存储空间的管理
new表达式的三种形式:
1.分配单个对象:new 类型或者 new 类型(初始值)
2.分配多个连续存储的对象:new 类型[数组大小]
3.定位new,在指定位置分配空间:new (指针) 类型;
new运算符分配的空间用delete运算符释放
1.释放new分配的单个对象用delete 指针;
2.释放new分配的数组用delete[] 指针;
3.定位new没有对应的delete表达式
注:delete后的ip不是空指针,而是“空悬指针”,即指向不确定的单元。delete之后,继续通过ip间接使用这个单元是非法的,会引起不可预料的运行错误
引用
引用由类型标识符和一个取地址符(&)来定义:type& refVariable = leftValue;
引用必须被初始化,初始值是一个有内存地址的对象,不能与字面值或某个表达式的计算结果绑定在一起。引用一旦初始化,就不能再指向其他的对象,对左值引用的所有操作都会被应用在它所指向的对象上。定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用,一旦初始化完成,引用将和它的初始值对象一直绑定在一起。引用本身不是对象,所以不能定义引用的引用
右值引用就是必须绑定到右值的引用,右值引用必须被初始化,初始值是右值表达式,不能将右值引用直接绑定到一个左值上,右值引用由类型标识符和两个取地址符(&&)定义:类型 &&右值引用变量 = 右值表达式;
关键字const限定的对象是不可改变的,C++允许将一个非const地址赋值给const指针。
关键字volatile限定的对象不能被编译器例行优化
struct 结构体类型名{成员声明;};
迭代器
vector<类型>::iterator it; string::iterator it3; vector::const_iterator it4; string:: const_iterator it5;
iter->mem:解引用iter并获取该元素的成员mem,等价于(*iter).mem
函数
函数定义:返回类型 函数名(参数列表) { 函数体 }
调用执行函数:函数名(实参列表);
函数定义中的参数被称为形式参数,简称形参,在调用函数时提供的数据称为实际参数,简称实参,函数调用时提供的实参个数和类型必须与函数定义中的形参个数和类型匹配。
函数调用时,主调函数的执行暂时中断,被调函数开始执行。
返回指针、引用时,返回绑定的内容一定是(函数结束后也)存在的不能用局部变量。
遇到return语句时,结束函数的执行,返回return语句中的值(如果有的话),将控制权从被调函数转移回主调函数,函数的返回值用于初始化调用表达式的结果,之后继续完成调用所在的表达式的剩余部分
当实参的值被复制给形参时,形参和实参是两个独立的对象,实参被称为按值传递,或传值调用函数,C++的默认参数传递方式,传指针:使用指针参数是传地址值
重载函数:名字相同、功能类似,但参数不一样的一组函数。多个函数可以共享同一个函数名,针对不同的参数类型提供不同的操作。重载函数的参数表必须不同,参数个数不同或参数类型不同。返回类型不能区分两个重载函数,因为调用函数时可以忽略函数的返回值