首页 > 代码库 > 面向对象程序中的常量

面向对象程序中的常量

一、常数据成员 

    使用const关键字进行说明的数据成员,称为常数据成员。其作用和用法与一般常变量(const变量)相似,但常数据成员的值是不能改变的。

注意:只能通过构造函数的参数初始化表对常数据成员进行初始化,不能采用在构造函数中对常数据成员赋初值的方法。

例如:

    如在类体中定义了常数据成员age:

         const int age;    //声明age为常数据成员

    在类外定义构造函数,应写成以下形式: 

          CStudent∷Cstudent(int a):age (a){……}//通过参数初始化表对常数据成员age初始化。

          CStudent∷Cstudent(int a){age=a;}     //错误,不能在函数体中初始化常数据成员。

注:为了与长对象进行区别,特别强调常数据成员可以被非const和const类型函数只读。

二、常对象

1、定义

常对象:对象的所有成员在程序中不能被修改,数据初始化后即为只读模式。   

 

2、定义常对象的一般形式为

      类名 const 对象名[(实参列表)];   

      const 类名 对象名[(实参列表)];  

例如:一个日期对象始终表示2000年5月1号,可以定义为:

      Cdate const d1(2000,5,1);        //d1是常对象

3、注意

以Cdate类为例,该类的定义如下:

<pre name="code" class="cpp">#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

//日期类声明
class Cdate	
{	
public:
	Cdate(int y=1985, int m=1,int d=1) //日期类的构造函数
	{    
		year=y;
		month=m;
		day=d;
		cout<<"调用日期类的构造函数"<<endl;
	}

	Cdate(Cdate &s) //日期类的拷贝构造函数
	{    
		year=s.year;
		month=s.month;
		day=s.day;
		cout<<"调獭用日期类的拷贝构造函数"<<endl;
	}

	~ Cdate()
	{   
		cout<<"调用日期类的析构函数"<<endl;
	}
	void Print()
	{
		cout<<"调用Print()函数:"<<endl;
		cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
	}
private:
	int year,month ,day;	//定义3个整型变量,分别表括示日期的年月日
};

int _tmain(int argc, _TCHAR* argv[])
{
	Cdate d1(2001,5,1);     
	d1.Print();
	system("pause");
	return 0;
}

1)常对象在定义时必须要有初值,通过带参数的构造函数或构造函数的参数初始化表进行初始化。

    Cdate d1(2000,5,1);          //一般对象

    Cdate const d2 ;             // d2是常对象

 d2=d1;           //错误,常对象必须在定义的时候赋初值

2)常对象只能以只读的方式访问常成员函数,而不能访问非常成员函数。

如果希望成员函数可引用常对象中的数据成员,只需将该成员函数声明为const即可。

声明格式:返回值类型 函数名() const 

注意const修饰符的位置在最后面,且构造析构函数不用const修饰!

   例如:

  const Cdate d1(2000,5,1);          //一般对象

d1.Print();

则会报出如下错误:error C2662: “°Cdate::Print”: 不能将“this”指针从“const Cdate”转换为“Cdate &”

    改为:void print() const;       //将函数声明为const,即常成员函数。

常成员函数可以访问常对象中的数据成员,但仍然不允许修改常对象中数据成员的值。

三、常成员函数

使用const关键字进行说明的成员函数,称为常成员函数。常成员函数只能读取本类中的数据成员(非const数据成员和const数据成员),而不能修改它们的值。非const成员函数可以引用 const数据成员。

常成员函数说明格式如下:

类型标识符  函数名  ( 参数表 ) const;

常量的应用:

1) 如果在一个类中,有些数据成员的值允许改变,另一些数据成员的值不允许改变,则可以将一部分数据成员声明为const,以保证其值不被改变,可以用非const的成员函数引用这些数据成员的值,并修改非const数据成员的值。

2) 如果要求所有的数据成员的值都不允许改变,则可以将所有的数据成员声明为const,或将对象声明为const(常对象),然后用const成员函数引用数据成员,这样起到“双保险”的作用,切实保证了数据成员不被修改。

3) 如果已定义了一个常对象,只能调用其中的const成员函数,而不能调用非const成员函数(不论这些函数是否会修改对象中的数据)。这是为了保证数据的安全。如果需要访问对象中的数据成员,可将常对象中所有成员函数都声明为const成员函数,但应确保在函数中不修改对象中的数据成员。



面向对象程序中的常量