C++之常对象、常成员变量与常成员函数详解

来源:互联网 发布:java明日潘多拉 编辑:程序博客网 时间:2024/05/17 09:39

一、常对象说明:常对象是指对象的数据成员的值在对象被调用时不能被改变。常对象必须进行初始化,且能被更新。不能通过常对象调用普通成员函数,但是可以通过普通对象调用常成员函数。常对象只能调用常成员函数。常对象的声明如下:

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成员函数。


0 0