一、常对象说明:常对象是指对象的数据成员的值在对象被调用时不能被改变。常对象必须进行初始化,且能被更新。不能通过常对象调用普通成员函数,但是可以通过普通对象调用常成员函数。常对象只能调用常成员函数。常对象的声明如下:
const <类名> <对象名>
<类名> const <对象名>
两种声明完全一样没有任何区别。
1、通过下面例子来理解常对象:
A、请指出下面程序的错误
class A{
private:
int w,h;
public:
int getArea() const
{
return w*h;
}
int getW(){ return w;}
void setWH(int x,int y) {w=x,h=y;}
A(int x,int y){w=x,h=y;}
A(){;}//本例中不能省略
};
void main()
{
A a;//非常对象可以不初始化
a.setWH(3,9);
A const b; //常对象必须声明的同时初始化,正确的是 A const b(3,6)。
b.setWH(3,7); // 假如上面改正后用这一句,还是错误应为b是常对象不能调用非常成员函数,切其值调用时不能改变,setWH()
cout<< a.getArea()<<endl<< b.getArea()<<c.getArea();
system("pause");
二、常成员变量
C++中使用const关键字修饰的成员变量就是常成员变量,有两种定义方式:
const int c;
int const c;
需要注意的是:
1)任何函数都不可以对其值进行赋值和修改;
2)必须而且只能在构造函数的成员初始化列表中对其进行初始化;
3)假如类有多个构造函数,必须在所有的构造函数中都对其进行初始化。
三、常成员函数
前面已提到,一般的成员函数可以引用本类中的非const数据成员,也可以修改它们。如果将成员函数声明为常成员函数,则只能引用本类中的
数据成员,而不能修改它们,例如只用于输出数据等。如
void get_time( ) const ; //注意const的位置在函数名和括号之后
const是函数类型的一部分,在声明函数和定义函数时都要有const关键字,在调用时不必加const。常成员函数可以引用const数据成员,也可以
引用非const的数据成员。const数据成员可以被const成员函数引用,也可以被非const的成员函数引用。具体情况可以用表9.1表示。
数据成员 | 非const成员函数 | const成员函数 |
非const的数据成员 | 可以引用,也可以改变值 | 可以引用,但不可以改变值 |
const数据成员 | 可以引用,但不可以改变值 | 可以引用,但不可以改变值 |
const对象的数据成员 | 不允许 | 可以引用,但不可以改变值 |
那么怎样利用常成员函数呢?
1.如果在一个类中,有些数据成员的值允许改变,另一些数据成员的值不允许改变,则可以将一部分数据成员声明为const,以保证其值不被改
变,可以用非const的成员函数引用这些数据成员的值,并修改非const数据成员的值。
2.如果要求所有的数据成员的值都不允许改变,则可以将所有的数据成员声明为const,或将对象声明为const(常对象),然后用const成员函数
引用数据成员,这样起到“双保险”的作用,切实保证
3.如果已定义了一个常对象,只能调用其中的const成员函数,而不能调用非const成员函数(不论这些函数是否会修改对象中的数据)。这是为了
保证数据的安全。如果需要访问对象中的数据成员,可将常对象中所有成员函数都声明为const成员函数,但应确保在函数中不修改对象中的数
据成员。
不要误认为常对象中的成员函数都是常成员函数。常对象只保证其数据成员是常数据成员,其值不被修改。如果在常对象中的成员函数未加
const声明,编译系统把它作为非const成员函数处理。还有一点要指出,常成员函数不能调用另一个非const成员函数。