一、常量对象
如果我们不希望某个对象的值被改变,则定义该对象的时候可以在前面加上 const 关键字
如:
class Demo{
private :
int value;
public:
void SetValue(){}
};
const Demo Obj; // 常量对象
二、常量成员函数
(1)在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数。
(2)常量成员函数执行期间不应修改其所作用的对象因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外)
(3)也不能调用同类的非常量成员函数(静态成员函数除外)
原因:其它类的成员函数有可能会修改他所作用的对象
如下:注意加const 的位置
class Sample{
public:
int value;
void GetValue()const;//定义常量成员函数
void func() {};
Sample(){};
};
SetValue{}
void Sample::GetValue() const{ //类外定义,注意const 的位置
value = 0; // wrong
func(); //wrong
}
int main(){
const Sample o;
o.value =100; //erro 常量对象不可被修改
o.func(); //erro 常量对象上不能执行非常量成员函数
o.GetValue(); //ok 常量对象上可以执行常量成员函数
return0;
}
常量成员函数的重载
两个成员函数,名字和参数表都一样,但是一个是const,一个不是,算重载;
如
class CTest {
private:
int n;
public:
CTest() { n = 1; }
int GetValue() const { return n; }
int GetValue() { return 2 * n; }
};
int main() {
const CTest objTest1;//常量对象
CTest objTest2;
cout << objTest1.GetValue() << "," << objTest2.GetValue(); //常量对象会调用常量成员函数
return 0;
}
运行结果:
三、常引用
引用前面加const 关键字,就是常引用,他的作用是不能通过常引用,去修改他引用的变量
int const &r = n;
r=4;//错误,不能通过常引用去修改所引用的变量的值n
n=5;// ok 引用的值是可以改变的
对象作为函数的参数时,生成该参数需要调用复制构造函数,效率比较低。用指针作参数,代码又不好看!!!如何解决?
我们可以采用 对象的引用来解决这个问题
class Sample{
...
};
void printfObj(Sample & o){} //对象的引用
对象引用作为函数的参数有一定风险性,若函数中不小心修改了形参,则实参也跟着变,这可能不是我们想要的。如何避免?
class Sample{
...
};
void printfObj(const Sample & o){} //对象的常引用 ,注意const的位置