左值和右值
左值:是指具有持久地址的对象,可以出现在赋值操作符的左侧或右侧。这里的对象可以是变量名,也可以是表达式。抓重点“有一个持久的内存位置,因此可以被多次读写”。
右值:是指不具有持久地址的对象,通常只能出现在赋值操作符的右侧,通常表示的是临时的、即将被丢弃的对象。主要包括字面量(如8, 'a', 'Shanghai', 3.14)、返回非引用类型的表达式(如函数返回非引用类型)、临时对象(如类型转换表达式产生的临时对象)、返回右值引用的表达式(如 std::move()
),抓重点“是临时的,一旦被使用,其生命周期就结束了,出现即结束,因此不可以被多次读写”。
const限定符 - 修饰变量
const修饰变量时,表示声明了一个常量变量,必须进行初始化,这和创建引用变量一样(必须在声明引用时将其初始化)
const int num = 8; //正确写法,下面注释中的写法不对
int a;
int & b = a;
/*
常量
const int num;
num = 8;
引用
int a;
int & b;
b = a;
*/
修饰函数返回类型
说明函数的返回值不能被修改,这种用法主要用于返回引用类型的函数,因为对于返回值类型为基本数据类型(如 int
, double
等)或复杂对象(如 std::string
, 用户定义的类型等)的函数,返回值本身就是一个副本,无论是否加 const
修饰,都不影响到原始值。
//如有如下函数原型,其中Stock是一个类
const Stock & topval(const Stock & s) const;
如上第一个const指明函数的返回值不能被修改,该函数返回一个对Stock
对象的引用,保证了不被修改,这对于保护数据不被意外修改非常有用。
修饰函数参数
如上第二个const表示以常量引用的方式传递一个Stock对象s
,这样可以避免复制对象,提高效率,同时也表明topval
函数不会修改传入的Stock
对象。
修饰函数体
末尾的const
关键字说明这是一个const
成员函数,目的是表明该函数在执行过程中不会修改类的任何非静态数据成员。这使得 const
对象能够调用这些函数,因为这些函数不会改变对象的内部状态。