首页 > 代码库 > 面向对象程序中的常量
面向对象程序中的常量
一、常数据成员
使用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成员函数,但应确保在函数中不修改对象中的数据成员。
面向对象程序中的常量