#const 修饰普通类型的变量
const int a 7;
int b = a; //it's right
a = 8; //it's illegal
a被定义为一个常量,可以将a赋值给b,但是不能给a再次赋值。对一个常量赋值是违法的事情,因为a被编译器认为是一个常量,其值不允许被修改。
#const 修饰指针变量
##修饰指针指向的内容
const int *p = 8;//const 位于 * 的左边
指针指向的变量不可变
##修饰指针
int a= 8;
int * const p = &a;
*p = 9;//it's right
int b=7;
p = &b;//it's illegal
指针变量(p)本身不可变,即指针指向的内存地址(&a)不可变,亦指针无法改变所指向的变量
但是,指针指向的变量(a)可变,即*p可变。
##修饰指针和指针指向的内容
int a = 8;
const int * const p = &a;
指针(p)指向的内存地址不可变,同时,指针(p)指向的变量(a)不可变。
总结:左定值,右定向,const修饰不变量。
#const 修饰函数参数
##const参数为普通类型
void function(const int a)
{
//++a;//it's illegal
}
注:一般值传递不需要const修饰,因为函数会自动产生临时变量复制实参值。除非,需要强制限制实参值不可变。
##const参数为指针类型
void function(int * const a)
{
*a =9;
}
当const参数为指针时,可以防止指针被意外篡改。
##const参数为引用类型
void function(const SelfDefinedClass & tmp)
{
//.....
}
引用传递的使用场景:参数类型为自定义类型,并且临时变量的构造代价较大(时间或空间),我们可以通过引用传递减少临时变量的构造成本。
#const修饰函数返回值
#const修饰类成员函数
- const修饰的成员函数不能修改任何的成员变量
- const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量