标签:
一、常数据成员
使用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成员函数,但应确保在函数中不改动对象中的数据成员。
标签:
原文地址:http://www.cnblogs.com/gcczhongduan/p/4307941.html