到了做题阶段,发现对C++中一些常量和常对象、函数等这些东西还是区分的很不好,各种乱,所以有必要好好整理一下了。
这里我画了一张图,从这张图入手来分析结构应该会更清晰一些:
首先来看左上部分的常量:包括文字、符号常量和常变量。
文字常量就是一个具体的数字,如S(圆的面积)=r*r*3.14,3.14就是一个文字常量。
他有两个很明显的缺陷:可读性差和可维护性差。
为什么?一个没学过S(圆)的人,哪知道3.14是常量?而且,如果程序需要反复出现一万次这个公式,我们难道要写一万次3.14?这个还好,如果是3.1415926的话,呵呵,那就只剩下”呵呵"了。
符号常量就是一个符号化的数值(可以理解为符号化的文字常量~),来看定义形式:#define PI 3.14
在定义时候要注意:1、不能用=;2、不能用分号结尾,因为#define是预处理指令。
另外,他弥补了文字常量的不足,具有良好的可读性和可维护性,这里就不多说了,很好理解。
常变量又是什么?当然就是常(变量)啦。从定义格式来看:const 数据类型 符号常量名 = 数值;也就是const+变量定义,所以它就是用const修饰的变量。注意:在定义时,一定要给它初始化,以保证其不被修改。
对比三者之间的联系:符号常量=符号化(文字常量);常变量=用const定义的(符号常量)
接着说常变量。我们在程序中,通常都是使用常变量而不是符号常量,为什么?
这也是它独特的优点:1、格式良好,与我们常见的变量定义格式类似;
2、类型明确,我们可以按需要选择明确的类型,以节省空间。
再提一个问题:为什么前两个常量类型没有数据类型?因为它们不占内存!只有常变量才占,所以要考虑数据类型的问题。
下面说另一大部分——常对象与常成员,包括常对象、成员函数及常数据成员。
常对象,其实就是不允许修改的对象。来看定义格式:类型 const 对象名 或 const 类型 对象名,这是两种形式。
它的初始化同常数据成员一样,都要通过构造函数来进行。如:
int main()
{
const Clock C1(14:51:22) //定义常对象,并进行了初始化
}
Class A{
private:
const int& r;//定义常引用数据成员
const int a;//常数据成员
public:
A(int i):a(i),r(a) //常数据成员初始化
{
cont<<"Show!"<<endl;
}
}
访问性:常对象与常成员函数能且只能互相访问。
常数据成员就是const修饰的数据成员。显然,它是一个数据成员,那么它与上面谈到的常变量有什么关系?
他们的相同点是定义形式一样;区别就是前者(常数据成员)必须在类体内定义。
常成员函数上面我们也提到了它和常对象的情意绵绵,实际上,它就是为了访问类的常对象而生的!
它的定义形式和以上几个有些不同:返回类型 成员函数名 (参数表) const;const要在最后边。
下面有一张成员函数和对象的操作关系图,清晰地呈现了二者的恩怨纠葛:
最后就是一般函数和常函数的重载问题,总结起来就一句话:常对象调用常成员函数,一般对象调用一般成员函数。
总结:无论是常对象、成员还是常量,都要遵循“常”的原则,打死都不变!
本文的重点就是思维导图展示的关系和常变量、常成员及对象的区分。其实这些关系无非也就是平日里“常常联合”,重载时“各回各家”。只要理清他们的关系,做到心中有图就可以了。