1. 函数的调用是依赖指针的原始类型而不管它实际指向何方。
2. 虚函数是在程序执行期进行的动态绑定或后期绑定;而非虚函数是程序在编译时间进行的静态绑定或前期绑定。
3. 纯虚拟函数不需定义其实际动作,它的存在只是为了在衍生类别中被重新定义,只是为
了提供一个多态接口。只要是拥有纯虚拟函数的类别,就是一种抽象类别,它是不能够
被具象化的,也就是说,你不能根据它产生一个对象。
virtual void display() = 0; // 注意"= 0"
4. 抽象类别不能产生出对象实体,但是我们可以拥有指向抽象类别之指针。
5. 虚拟函数衍生下去仍为虚拟函数,而且可以省略virtual 关键词。
6. 每一个「内含虚拟函数的类别」,编译器都会为它做出一个虚拟函数表,表中的每一笔元素都指向一个虚拟函数的地址。此外,编译器当然也会为类别加上一项成员变量,是一个指向该虚拟函数表的指针vPtr(占4个字节)。
7. 类对象的内存区块中不能看到任何与成员函数有关的任何东西。
8. (CDocument*)(&mydoc))->func()只是把指针的类型改变了,并没有改变指针所指向的内容类型,所以会调用指针原来指向的函数。(CDocument)mydoc).func()下上的强制类型转换会造成对象切割,因此会调用CDocument类型中的函数。
9. 静态成员变量在使用前,必须初始化,并且初始化不受private权限的控制。不要把static成员变量的初始化放在构造函数或头文件中,因为构造函数或头文件可能被调用多次。应该放在main函数或全局函数中,或任何函数之外。
class SavingAccount
{
private:
char m_name[40]; // 存户姓名
char m_addr[60]; // 存户地址
double m_total; // 存款额
static double m_rate; // 利率
...
public:
static void setRate(double newRate) { m_rate = newRate; }
...
};
double SavingAccount::m_rate = 0.0075; // 设置 static 成员变量的初值
10. 如果你希望在产生任何object 之前就存取其class 的private static 成员变量,则必须设计一个static 成员函数。
11. C++ 的new 运算子和C 的malloc 函数都是为了配置内存,但前者比之后者的优点是,new 不但配置对象所需的内存空间时,同时会引发构造式的执行。
12. 当衍生类别的对象诞生之时,构造式的执行是由最基础类别至最尾端衍生类别;当对象要毁灭之前,析构式的执行则是反其道而行。
13. 对于静态(static)对象,当对象诞生时其构造式被执行;当程序将结束时(此对象因而将遭致毁灭)其析构式才被执行,但比全域对象的析构式早一步执行。
14. 四种不同的对象生存方式:
1) 堆栈(stack)之中产生它:
void MyFunc()
{
CFoo foo; // 在堆栈(stack)中产生foo 对象
...
}
2) 在堆积(heap)之中产生它:
void MyFunc()
{
...
CFoo* pFoo = new CFoo(); // 在堆(heap)中产生对象
}
3) 产生一个全域对象(同时也必然是个静态对象):
CFoo foo; // 在任何函数范围之外做此动作
4) 产生一个区域静态对象:
void MyFunc()
{
static CFoo foo; // 在函数范围(scope)之内的一个静态对象
...
}
15. 执行时期型别信息(Runtime Type Information,RTTI): 在程序执行过程中知道某个对象是属于哪一种类别。使用方法:首先包含typeinfo.h,其次使用typeid运算子。
typeid(GIFimage) == typeid(*type) //GIFimage是类型名,type是对象。
编译时需选用/GR 选项。// RTTI.CPP - built by C:/> cl.exe -GR rtti.cpp <ENTER>
16. 动态生成这段没看懂。~
这笔记写了有一段时间了,一直没放上来!