博文
为什么C++编译器不能支持对模板的分离式编译(2008-09-04 13:02:00)
摘要:为什么C++编译器不能支持对模板的分离式编译
刘未鹏(pongba)
C++的罗浮宫(http://blog.csdn.net/pongba)
首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文件)文件格式,并且本身包含的就已经是二进制码,但是不一定能够执行,因为并不保证其中一定有main函数。当编译器将一个工程里的所有.cpp文件以分离的方式编译完毕后,再由连接器(linker)进行连接成为一个.exe文件。
举个例子:
//---------------test.h-------------------//
void f();//这里声明一个函数f
//---------------test.cpp--------------//
#include”test.h”
void f()
{
…//do something
} //这里实现出test.h中声明的f函数
//---------------main.cpp--------------//
#include”test.h”
int main()
{
f(); //调用f,f具有外部连接类型
}
在这个例子中,test. cpp和main.cpp各自被编译成不同的.obj文件(姑且命名为test.obj和main.obj),在main.cpp中,调用了f函数,然而当编译器编译main.cpp时,它所仅仅知道的只是main.cpp中所包含的test.h文件中的一个关于void f();的声明,所以,编译器将这里的f看作外部连接类型,即认为它的函数实现代码在另一个.obj文件中,本例也就是test.obj,也就是说,main.obj中实际没有关于f函数的哪怕一行二进制代码,而这些代码实际存在于test.cpp所编译成的test.obj中。在main.obj中对f的调用只会生成一行ca......
关于类的私有成员(2008-07-29 16:15:00)
摘要:对于c++来说,其中一个类里声明的所有私有成员(包括成员函数和成员变量)对于该类的所有对象来说都是透明的,即对该类的对象A和对象B来说,A可以直接访问B的成员变量,直接调用B的成员函数,正像HashTable的transfer函数实现时的源代码那样。......
虚函数与纯虚函数(2008-07-02 21:24:00)
摘要:虚函数:
在函数的声明前面加上一个“virtual”关键字,便可声明一个虚函数。
从本质上讲,虚函数实现了“一个接口,多种方法”的理念,而这种理念是多态性的基础。
基类通过在函数声明前加“virtual”定义一个虚函数,其各级派生类将继承这一虚函数,同时也继承了这一函数的虚属性。如果在某一派生类中重新定义了该虚函数的实现,则一个指向该类对象的基类指针或基类引用在调用该对象的该函数时将调用该类中定义的内容;如果在该派生类中没有定义该虚函数的实现,则一个指向该类对象的基类指针或基类引用在调用该对象的该函数时将调用在继承关系中曾定义了该函数的与当前类距离最近的类中定义的方法。
纯虚函数:
纯虚函数时没有在基类定义的虚函数,具体定义形式如下:
virtual type func-name(parameter-list)=0;
当一个虚函数变为纯虚函数时,任何派生类必须给出该函数的定义,如果派生类未能定义该纯虚函数,则将导致编译错误!
抽象类:至少包含一个纯虚函数的类称为抽象类。抽象类是不完整的类,因而不能创建抽象类的对象,但却可以创建抽象类的指针和引用。
......