共用数据保护(const类型)

常对象:定义对象时指定对象为常对象,常对象必须要有初值。

    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型数据的小结


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值