const 限定符
在c++11中,主要有两大应用:变量的限定和成员函数的限定
const 限定符用来表示不可变的对象。const 对象必须初始化。
变量的限定
1. 可以用来限定变量,内置或者类类型
例如
const int i = 42;
对类类型的限定如:
const Sales_data rhs ;
表示这些变量的值不可改变,即这些变量的值只能读,不能赋予新值。
2. 可以用来限定指针
const int * const ip = &i;
//指针ip是指向不可变的int型的常量指针。*p =23 意味着修改i,这是不允许的;p = q意味着改变指针指向的对象同样是不允许的操作。
指针是对象。在指针中有顶层const和底层const的概念。所谓顶层const指的是指针本身是const的,即常量指针;底层const是指针所指的对象是const的,即对象是常量
3. 可以用来限定引用
注意:引用不是对象,只是所引用对象的一个别名。因此它的const没有底层顶层之分!
如果所引用的对象是const的,则引用必须是const的:
const int &r = i;
引用不是对象,因此不存在
int & const ref = i;
成员函数的限定
成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。例如一个Sales_data类型的一个对象total,调用其成员函数如total.isbn(),则编译器负责把total的地址传递给isbn的隐式形参this,可以等价的认为编译器将该调用重写成了如下形式:
Sales_data::isbn(&total);
this是一个常量指针,不允许改变this中保存的地址。
而成员函数的const限定如以下形式:
class Sales_data{
public:
std::string isbn() const { return bookNo;} /*const位于函数形参列表之后*/
//其他成员
};
这里的const的作用是修改隐式this指针的类型。默认情况下,this的类型是指向类类型非常量版本的常量指针,加入const之后表示this是指向类类型常量版本的常量指针。即该函数不会改变Sales_data的数据成员。另外,通过区分成员函数是否是const的,可以对其进行重载。虽然常量对象可以调用非常量版本和常量版本的成员函数,但有时调用非常量版本是一个更好的匹配。