1、const修饰普通类型的变量
const int a = 7;
int b = a; // 正确
a = 8; // 错误,不能改变
a 被定义为一个常量,并且可以将 a 赋值给 b,但是不能给 a 再次赋值。对一个常量赋值是违法的事情,因为 a 被编译器认为是一个常量,其值不允许修改。
2、const 修饰指针变量
const 修饰指针变量有以下三种情况。
const int *p: const 修饰指针指向的内容,则内容为不可变量。
int* const p: const 修饰指针,则指针为不可变量。
const int* const p: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
左定值,右定向,const修饰不变量
3、const参数传递和函数返回值
1、值传递的 const 修饰传递,一般这种情况不需要 const 修饰,因为函数会自动产生临时变量复制实参值。
#include<iostream>
using namespace std;
void Cpf(const int a)
{
cout<<a;
// ++a; 是错误的,a 不能被改变
}
int main(void)
{
Cpf(8);
system("pause");
return 0;
}
2、当 const 参数为指针时,可以防止指针被意外篡改。
#include<iostream>
using namespace std;
void Cpf(int *const a)
{
cout<<*a<<" ";
*a = 9;
}
int main(void)
{
int a = 8;
Cpf(&a);
cout<<a; // a 为 9
system("pause");
return 0;
}
常量函数
常量函数是C++对常量的一个扩展,它很好的确保了C++中类的封装性。在C++中,为了防止类的数据成员被非法访问,将类的成员函数分成了两类,一类是常量成员函数(也被称为观察着);另一类是非常量成员函数(也被成为变异者)。在一个函数的签名后面加上关键字const后该函数就成了常量函数。对于常量函数,最关键的不同是编译器不允许其修改类的数据成员。例如:
class Test
{
public:
void func() const;
private:
int intValue;
};
void Test::func() const
{
intValue = 100;
}
上面的代码中,常量函数func函数内试图去改变数据成员intValue的值,因此将在编译的时候引发异常。
注意:在函数前面加上const表示返回的是一个常量。
当然,对于非常量的成员函数,我们可以根据需要读取或修改数据成员的值。但是,这要依赖调用函数的对象是否是常量。通常,如果我们把一个类定义为常量,我们的本意是希望他的状态(数据成员)不会被改变。那么,如果一个常量的对象调用它的非常量函数会产生什么后果呢?看下面的代码:
class Fred{
public:
void inspect() const;
void mutate();
};
void UserCode(Fred& changeable, const Fred& unChangeable)
{
changeable.inspect(); // 正确,非常量对象可以调用常量函数。
changeable.mutate(); // 正确,非常量对象也允许修改调用非常量成员函数修改数据成员。
unChangeable.inspect(); // 正确,常量对象只能调用常理函数。因为不希望修改对象状态。
unChangeable.mutate(); // 错误!常量对象的状态不能被修改,而非常量函数存在修改对象状态的可能
}