background image

 

则允许。委派构造函数调用语法上非常自然和易懂,事实上, C++ 不提供这一特性并不

 

是出于语法上的考虑,而是出于资源管理的考虑(这样的事情对 C++ 来说还有很多很

多)。

C++ 的构造函数用于分配资源,而析构函数用于释放资源,构造函数和析构函数调用必

 

须匹配,否则就打破了 C++ 的基本规则。如果允许委派构造函数调用,则显然会打破这

——

一规则

构造函数被执行两次,而析构函数只执行一次。当然,对一些类,例如前面的

 

那个 Point 

来说这不是个问题,但是从语言机制的角度讲这个特性可能属于 危险 的特性。

 

注:在最新的 C++ 标准提议草案中,Herb 等人有一个关于允许委派构造函数调用的提案,

 

当然这很大程度上是为了方便 C++ /CLI 绑定。

 

在 C++ 

 

构造函数中,虚函数调用会被编译器自动转为普通函数调用,而在 C# 构造函数

 

中允许进行虚函数调用。 C++ 

——  

这样处理自然有它的原因

在 C++ 中,构造函数执行完

成后对象才初始化好,对于多态对象来说,也就意味着构造函数在背后执行了很重要的

——

一件事情

初始化对象的虚函数表。

 

如 果我们在基类的构造函数中调用了虚函数,则因为此时对象的虚函数表仍旧是基类的

虚函数表,所以无法进行正确的虚函数调用。

 

也就是这个原因,通常我 们应该避免在构造函数中调用虚函数,因为它违背了虚函数的

语义。

 

而在 C# 中,在对象的构造函数执行之前对象的类型信息就已经初始化好了,所以可以

进行正常的虚函数调用。

基本上,这些就是两者之间的区别

C 与 C++的区别

C 是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C 程序的设计首