c++中虽然有不少有效的措施来增加数据的安全性,但有些数据往往是共享的,例如实参与形参,变量与引用,数据及指针等,人们可以在不同的场合通过不同的途径访问同一个数据对象,有时可能会在无意中改变有关数据的状况,而这是人们不愿意看到的。因此既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以把有关的数据定义为常量。
第一个“常量”是常对象:
常对象定义:类名 const 对象1,如 Time const t1 (Time是一个类,t1 是常对象,),由于t1是常对象,因此t1中的所有数据成员的值都不能被修改,并且通过该对象只能调用它的常成员函数,不能调用它的普通成员函数。例如如下我定义一个Box类,然后定义一个常对象,试图调用该对象中非常成员函数,则会报错
//定义一个Box类,
class Box
{
public:
Box();
Box(int ,int,int);
~Box();
int volum();
private:
int height;
int width;
int length;
};
//定义Box类的构造函数
Box::Box(int h,int w,int l)
{
height=h;
width=w;
length=l;
}
Box::Box()
{
height=10;
width=10;
length=10;
}
Box::~Box()
{
cout<<"destructor called"<<endl;
}
int Box::volum()
{
return (height*width*length);
}
int main()
{
Box const box1;
cout<<"the volum is "<<box1.volum()<<endl;//非法调用对象box1中的非常成员函数volume,报错
}
第二个是常成员函数:
常成员函数定义: 返回类型 函数名(参数表) const,例如我们定义Box类中的volum函数为常成员函数,则为 int volum() const;
常成员函数可以访问常对象中的数据成员,但不能修改常对象中的数据或成员的值。
第三个常识常数据成员:
常数据成员定义:const 类型 变量名,如 const int width;不能再构造函数中对常数据成员赋值,因为常数据成员是不能被赋值的,其初始化的方法是只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值。
第四个常是指向常对象的常指针:
定义:类名 *const 指针变量名;如Box *const box1
指向对象的常指针是指其指向不变,但指向的变量可以改变
第五个常是指向常对象的指针变量:
定义:const 类型名 *指针变量名;
第六个常是对象的常引用:
例如我们在上面提到的Box类中的volum函数可以重新定义如下:
int volum (Box &box)//形参box是Box类的引用
如此定义我们是可以修改实参对象中的数据成员的,为了避免修改,我们可以定义一个常引用,如下:
int volum(const Box &box)
如此声明则不会在函数中修改实参对象的的数据成员。
常指针和常引用一般做函数参数,如此既能保护数据安全,又能减少调用函数引起的实参拷贝。