c++ const关键字
- Const修饰成员变量
(1) Const修饰普通类型的变量,在定义时初始化。
① Const int num1 = 1024,此时num1的值不能再被修改。通常需要在定义时进行初始化。
(2) Const修饰指针变量
① const修饰指针指向的内容,则内容为不可变量。
如果只有一个const,位于*的左侧:表示指针所指的数据是常量,不能通过该指针修改实际数据。指针本身是变量,可以指向其他的内存单元。
Const int * ptr1_num1 = &num1;
Int const* prt2_num1 = &num1;
这两种写法是等价的,
Ptr1_num1 = &num2;//合法,因为可以把ptr1_num1指向其他其他内存单元
*ptr1_num1 = 1234//不合法 ,因为不能修改指针指向内存单元的数据。
② Const修饰指针,则指针为不可变量
如果只有一个const,位于*的右侧:表示指针不能指向其他内存单元,所指向的数据可以修改。
Int * const ptr2_num1 = &num1;
Ptr2_num1 = ptr1_num1//不合法,不能修改指针指向的内存地址。
*ptr2_num1 = 1234//合法
③ 如果有两个const位于*的左右侧,表示指针和指针所指向的数据都不能修改
int a = 8;const int * const p = &a;
2.Const修饰函数参数
(1) Const可以修饰形参,值传递。
Void function(const int var)
表明参数var,在函数内部不能改变他的值。因为函数修改形参的值并不会改变实参的值,所以一般不需要const修饰。
(2) Const修饰引用类型的参数时,不能修改引用对象的任何成员,只能调用const修饰的成员函数,好处是引用传递不需要一个新的参数副本(节省效率)。
Void constest(const Computer & mycomputer){
//参数为computer类型的mycomputer对象。不能修改mycomputer的任何成员变量。
}
3.Const修饰返回值
使用const修饰引用类型的一个常见的原因是:提高效率。
如果不加const,程序会返回一个复制的引用地址,如果加了const,地址是固定的,唯一的不变的,并且效率更高。
总结:在可以返回一个对象,也可以返回一个对象的引用时,应该首选引用,使用const更加有效率。
4.const修饰类
(1) Const修饰成员变量
表示成员变量不能被修改,同时只能在初始化列表中赋值
(2) Const修饰成员函数
① 目的是防止成员函数修改被成员变量的值。
Void function const{}
② 如果const成员函数想修改成员变量的值,用mutable关键字修饰成员变量。
class Test
{
public:
Test(int _a,int _b):_ca(_a),_cb(_b){}
void add()const
{
++_ca; // 错误
++_cb; // 正确 因为cb用mutable修饰了。
}
private:
int _ca;
mutable int _cb;
};
③ Const不能修饰构造函数,因为构造函数要修改类的成员变量。
④ Const不能修饰static静态成员函数。
成员函数中const是用来修饰this指针的,意味着this指向的内容不可变。this指针是某个具体对象的地址。Static静态成员是属于类的,所有对象共用static成 员,不属于某个具体的对象,所以static成员函数没有this指针,所以const不能修饰静态成员函数。
(3) Const修饰类对象
① 对象的任何成员都不能被修改
② 只能调用const成员函数
5.Const类型变量可以通过类型转换符const cast将const类型转换成非const类型。