常对象:定义对象时指定对象为常对象,常对象必须要有初值。
eg: Time const t1(12, 34, 56); //t1为常对象
在所有场合中,对象t1中所有成员的值不能被改变。
定义常对象形式: 类名 const 对象名 [(实参表列)] 或 const 类名 对象名 [(实参表列)]
注意:1.如果一个对象被声明为常对象,则不能调用该对象的非const型成员函数(除了由系统自动调用的隐式构造函数和析构函数)
2.把成员函数声明为const类型,就可引用常对象中的数据成员。
eg: void get_time() const; //将函数声明为const,表示get_time是一个const型函数,即常成员函数。
3.常成员函数可以访问常对象的数据成员,但任然不允许修改常对象的数据成员的值。
4.对数据成员声明为mutable, 就可以修改常对象中每个数据成员的值。
eg: mutable int count; //count声明为可变数据成员,这样可以用声明为const成员函数来修改值。
常对象成员:可以在声明类时将成员声明为const,即声明常数据成员和常成员函数。
①常数据成员:用const来声明常数据成员,常数据成员的值是不能改变的。
有一点要注意:只能通过构造函数的参数初始化表对常数据成员进行初始化。
如在类体中声明了常数据成员hour:
const int hour; //声明hour为常数据成员
如果在类外定义构造函数,应写成以下形式:
Time::Time(int h):hour(h){} //通过参数初始化表对常数据成员hour初始化在类体中声明了某一个数据成员为常数据成员后,该类的所有对象中的该数据成员的值都是不能 改变的,但不同对象中的该数据成员的值可以是不同的(在定义对象时给出)。
②常成员函数
常成员函数的定义:类型 函数名 const
说明:
1、如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们,例如只用于输出数据等。一般的成员函数可以引用本类中的非const数据成员,也可以修改它们。
2、在声明函数和定义函数时都要有const关键字,在调用时不必加const。常成员函数可以引用const数据成员,也可以引用非const的数据成员。
3、const数据成员可以被const成员函数引用,也可以被非const的成员函数引用。具体情况可以用下表1表示。
指向对象的常指针:将指向对象的指针变量声明为const型并将之初始化,这样指针值始终保持为其初不能改变,即其指向始终不变。
定义指向对象的常指针的一般形式为:类名 * const指针变量名=对象地址;
说明:
1、 Time tl(10,12,15),t2;//定义对象
Time *const ptrl=t1 //const位置在指针变量名前面,规定ptrl的值是常值并指向对象t1,此后不能再改变指向;
ptrl=&t2; //错误,ptrl不能改变指向
2、也可以在定义指针变量时使之初始化。
3、指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其所指向对象(如t1)中数据成员的值。
4、往往用常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其始终指向原来的对象。如果在函数执行过程中修改了该形参的值,编译系统就会发现错误,给出出错信息,这样比用人工来保证形参值不被修改更可靠。
指向常对象的指针变量:
定义指向常变量的指针变量的一般形式为: const 类型名 * 指针变量名;
例:下面定义了一个指向常变量的指针变量ptr:
const char *ptr;
注意:const的位置在最左侧,它与类型名char紧连,表示指针变量ptr指向的char变量是常变量,不能通过ptr来改变其值的。
说明:
(1)如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用一般的(指向非const型变量的)指针变量去指向它。
(2)指向常变量的指针变量除了可以指向常变量外,还可以指向来被声明为const的变量。此时不能通过此指针变量改变该变量的值。
(3)如果函数的形参是指向非const型变量的指针,实参只能用指向非const变量的指针,而不能用指向const变量的指针,这样,在执行函数的过程中可以改变形参指针变量所指向的变量(也就是实参指针所指向的变量)的值。如果函数的形参是指向const型变量的指针,在执行函数过程中显然不能改变指针变量所指向的变量的值,因此允许实参是指向const变量的指针,或指向非const变量的指针。 使用形参和实参的对应关系见表2。
以上的对应关系与在(2)中所介绍的指针变量和其所指向的变量的关系是一致的:指向常变量的指针变量可以指向const和非const型的变量,而指向非const型变量的指针变量只能指向非const的变量。
以上介绍的是指向常变量的指针变量,指向常对象的指针变量的概念和使用是与此类似的,只要将“变量”换成“对象”即可。
(1)如果一个对象已被声明为常对象,只能用指向常对象的指针变量指向它,而不能用一般的(指向非const型对象的)指针变量去指向它。
(2)如果定义了一个指向常对象的指针变量,并使它指向一个非const的对象,则其指向的对象是不能通过指针来改变的。
(3)指向常对象的指针最常用于函数的形参,目的是在保护形参指针所指向的对象,使它在函数执行过程中不被修改。
(4)如果定义了一个指向常对象的指针变量,是不能通过它改变所指向的对象的值的,但是指针变量本身的值是可以改变的。
对象象的常引用:
eg:对象的常引用。
#include <iostream>
using namespace std;
class Time
{ public:
Time(int,int,int);
int hour;
int minute;
int sec; };
Time::Time(int h,int m,int s) //定义构造函数
{ hour=h;
minute=m;
sec=s; }
void fun(Time &t) //形参t是Time类对象的引用
{ t.hour=18;}
int main()
{ Time t1(10,13,56); //tl是Time类对象
fun(t1); //实参是Time类对象,可以通过引用来修改实参d的值
cout<<t1.hour<<endl; //输出t1.hour的值为18
return 0; }
如果不希望在函数中修改实参t1的值,可以把引用t声明为const(常引用),函数原型为
void fun(const Time &t);
则在函数中不能改变t的值,也就是不能改变其对应的实参和t1的值。
在面向对象程序设计中,经常用常指针和常引用作函数参数。这样既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝。在学习8节时会知道,每次调用函数建立实参的拷贝时,都要调用复制构造函数,要有时间开销。用常指针和常引用作函数参数,可以提高程序运行效率。
6、const型数据的小结