关于常成员函数:
const double function() 和 double function()const; 很多人可能将他们两个混为一谈了,但是二者并不完全相同。前者是必须保证返回的值是这个常量(注:变量不可), 后者是要求你的函数中不涉及改变类的数据成员的值,可以进行输出等,但不可改变数据成员的值。
除了上述关于常函数的论述,还有很多人把静态成员函数和常函数混为一谈,考试也经常进行相关的考试,强调的是常函数是有 this 指针的。
静态函数、静态数据成员
首先:静态函数是没有 this 指针的,因为浅层可以理解为 this 指针就是一个具体的对象,因为静态函数不属于具体的对象,故没有 this 指针。同样的静态数据成员也不属于对象。关于静态数据成员,调用其有两种方式:一种是通过类名::,一种是对象名. 形式。同时必须在类外进行初始化。
虚函数:
背景:
对于虚函数,首先需要明白的是为什么要出现虚函数:
假设有一个基类,含有成员函数 A,同时他的派生类中也重新定义了新的 A,且基类中的首部与派生类的首部均相同,这样会导致派生类的再次定义将基类的 A 覆盖了,当我们在主函数中想调用基类的 A 的话就需要:派生类对象. 基类::A(),很显然,当程序较复杂时,这样会降低我们的效率。
出现:
为了解决上述问题,虚函数应运而生,我们在想调用基类的函数时,就可以重新定义一个基类指针,使之指向派生类对象,再次调用 A 函数,便调用的是基类的函数。很多人可能会说我也可以不将其定义为虚函数,但是运用同样的方法来调用基类的函数!是的,但是那样没有运用多态性。
综上所述它能很好的消除了二义性。
构造函数调用顺序:
在这个地方先给出大致的顺序:1. 基类 2. 子对象 3. 派生类自身
通过这个例子我们可以清楚的发现这个大顺序。
更细的:
对于子对象之间的构造函数的调用顺序:取决于子对象的声明顺序,跟他的初始化顺序无关。
基类:
取决于在派生类的声明顺序,跟基类的定义顺序和在派生类的初始化顺序无关。
关于 const 的两个易混淆点:
1.
在这个题中,由于 const 在 name 的前边,说明这个是要求地址不变,分析 bcd:对于 B,重新赋值就相当于改变了地址,对于 CD 两个运用的动态开辟空间,改变了地址。正确选项 A:该选项只是改变了 name 数组的第三个变量的值,故并没有改变数组的地址。故正确。
2.
对比上下两个题的区别,发现 const 在此题中的位置发生了改变。他放到了数据类型的前边,这就会使得要求变为 p 指向的变量不能发生改变!
本文保留所有权利,版权归河北工业大学梦云智软件开发团队所有。 未经团队及作者事先书面同意,您不得以任何方式将本文内容进行商业性使用或通过信息网络传播本文内容。 本文作者:郝泽龙