面向对象程序中的常量

一、常数据成员 

    使用constkeyword进行说明的数据成员,称为常数据成员。其作用和使用方法与一般常变量(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,即常成员函数。

常成员函数能够訪问常对象中的数据成员,但仍然不同意改动常对象中数据成员的值。

三、常成员函数

使用constkeyword进行说明的成员函数,称为常成员函数。常成员函数仅仅能读取本类中的数据成员(非const数据成员和const数据成员),而不能改动它们的值。非const成员函数能够引用 const数据成员。

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

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

常量的应用:

1) 假设在一个类中,有些数据成员的值同意改变,还有一些数据成员的值不同意改变,则能够将一部分数据成员声明为const,以保证其值不被改变,能够用非const的成员函数引用这些数据成员的值,并改动非const数据成员的值。

2) 假设要求全部的数据成员的值都不同意改变,则能够将全部的数据成员声明为const,或将对象声明为const(常对象),然后用const成员函数引用数据成员,这样起到“双保险”的作用,切实保证了数据成员不被改动。

3) 假设已定义了一个常对象,仅仅能调用当中的const成员函数,而不能调用非const成员函数(不论这些函数是否会改动对象中的数据)。这是为了保证数据的安全。假设须要訪问对象中的数据成员,可将常对象中全部成员函数都声明为const成员函数,但应确保在函数中不改动对象中的数据成员。




原文地址:https://www.cnblogs.com/gcczhongduan/p/4307941.html