1.)常量对象
如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字。
代码:
class Demo{
private:
int value;
public:
void SetValue(){ }
};
const Demo Obj;//常量对象,它的值不可修改
2.) 常量成员函数
1.在类的成员函数说明后面加上const关键字,则该成员函数为常量成员函数。
2.常量成员函数执行期间不应该修改其作用的对象。因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)。【之所以其不可调用成员变量和成员函数是因为,这两个会修改对象值。而静态的不会访问非静态的成员变量,故不会修改对象的值】
代码:
lass Sample
{
public:
int value;
void GetValue() const;//常量成员函数
void func(){};
Sample();
};
void Sample::GetValue() const
{
value=0;//wrong
func();//wrong
}
int main()
{
const Sample o;//定义常量对象
o.value=100;//wrong,常量对象不可被修改
o.func();//wrong,常量对象不可以执行非常量成员对象
o.GetValue();//ok,常量对象可以执行常量成员函数
return 0;
}
3.成员函数的重载: 两个成员函数,名字和参数都一样,但是有一个是const,一个不是,算重载,而不是重复定义。
代码:
//常量成员函数的重载
#include<iostream>
using namespace std;
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()<<endl;
return 0;
}
结果:
1,2
3.) 常引用
引用前面加const关键字,成为常引用。不能通过常引用,修改其引用的变量。
代码:
const int & r=n;
r=5;//error
n=4;//ok
对象作为函数参数时,生成该参数需要调用复制构造函数,效率比较低。用指针做参数又不好看,此时可以用对象的引用做参数。
代码:
class Sample{
......
};
void PrintObj(Sample & s)//对象的引用做参数,省时
{
......
}
可是对象引用作为参数有风险,如果函数中不小心修改了形参对象,则实参也会改变。改进方法:常引用。
class Sample{
......
};
void PrintfObj(const Sample & s)//这里与上面例子有差别,该函数内,不可通过常引用修改s的值,也就不会修改实参对象的值。
{
......
}