8.9 对象的组织
有了自己定义的类,或者使用别人定义好的类创建对象,其机制与使用int等创建普通变量几乎一致,同样可以const对象来创建指向对象的指针和创建对象数组,还可使用new和delete等创建动态对象。
8.9.1 const对象
类对象也可以声明为const对象,一般来说,能作用于const对象的成员函数除了构造函数和析构函数外,便只有const成员函数了,因为const对象只能被创建、撤销以及只读访问,改写是不允许的。const对象的使用见代码8.20。
代码8.20 const对象ConstObject
<———————————-文件名:point.h———————————————————>
01 #include<iostream> 02 using namespace std; 03 class point//类定义 04 { 05 int x;//默认private型成员变量x和y 06 int y; 07 public: 08 point(int xp=0,int yp=0)//构造函数 09 { 10 x=xp; 11 y=yp; 12 } 13 void Setx(int xp)//非const成员函数Setx,设置x 14 { 15 x=xp; 16 } 17 void Sety(int yp)//非const成员函数Sety,设置y 18 { 19 y=yp; 20 } 21 void print()const//const成员函数print,不能修改x和y 22 { 23 cout<<"x:"<<x<<",y:"<<y<<endl; 24 } 25 }; <———————————-文件名:example820.cpp———————————————-> 26 #include"point.h" 27 using namespace std; 28 int main() 29 { 30 point pt(3,4);//声明一个普通类变量pt 31 pt. Setx(5);//使用pt可调用非const成员函数 32 pt. Sety(6); 33 pt. print();//pt也可调用const成员函数 34 const point ptc(1,2);//声明一个const对象(类变量) 35 //ptc. Setx(8);//错误,ptc是const对象,只能调用const成员函数 36 //ptc. Sety(9);//错误,ptc是const对象,只能调用const成员函数 37 ptc. print();//正确,const对象只能调用const成员函数 38 return 0; 39 }
输出结果如下所示。
x:5,y:6 x:1,y:2
【代码解析】代码8.20中,pt是point类的普通对象,通过pt可调用成员函数Setx和Sety函数改写数据成员x和y的值,但ptc是const对象,只能调用const成员函数print,而不能调用非const成员函数(代码第35~36行,即便该成员函数并不修改数据成员的值)。一旦const成员调用了非const成员函数,编译器将会指明错误。
以对象作为函数参数时,为避免对象复制引入的开销,多将参数对象声明为引用类型,这时,为避免对对象参数的偶然修改,常在函数的形参列表中用const修饰,这样,在函数体内只能使用该对象的const成员函数。
说明
对构造函数(含复制构造函数)和析构函数而言,其不能被定义成const成员,但却能被const对象调用。