设为首页 加入收藏

TOP

C#构造函数与C++的区别浅析
2013-10-07 01:03:25 来源: 作者: 【 】 浏览:75
Tags:构造 函数 区别 浅析

C#构造函数与C++(www.cppentry.com)的区别1、

C++(www.cppentry.com) 不允许在一个构造函数中调用另外一个构造函数(称为委派构造函数调用),而 C# 则允许。例如:

C++(www.cppentry.com)构造函数示例:

  1. struct Point {  
  2. public:  
  3. int X, Y;  
  4. Point(int x, int y);  
  5. Point(Point pt) : Point(pt.X, pt.Y) { } // 错误,C++(www.cppentry.com) 不允许  
  6. };  

C#构造函数示例:

  1. struct Point {  
  2. public int X, Y;  
  3. public Point(int x, int y);  
  4. public Point(Point pt) : Point(pt.X, pt.Y) { } // 可以,C# 允许  
  5. };  

委派构造函数调用语法上非常自然和易懂,因此你也许会质疑 C++(www.cppentry.com) 不提供它是不是故意给程序员添麻烦。事实上,C++(www.cppentry.com) 不提供这一特性并不是出于语法上的考虑,而是出于资源管理的考虑(噢,这样的事情对 C++(www.cppentry.com) 来说还有很多很多)。

我们知道,C++(www.cppentry.com) 的构造函数用于分配资源,而析构函数用于释放资源,构造函数和析构函数调用必须匹配,否则就打破了 C++(www.cppentry.com) 的基本规则。

如果允许委派构造函数调用,则显然会打破这一规则——构造函数被执行两次,而析构函数只执行一次。当然,对一些类,例如前面的那个 Point 来说这不是个问题,但是从语言机制的角度讲这个特性可能属于“危险”的特性。注:在最新的 C++(www.cppentry.com) 标准提议草案中,Herb 等人有一个关于允许委派构造函数调用的提案,当然这很大程度上是为了方便 C++(www.cppentry.com)/CLI 绑定。

C#构造函数与C++(www.cppentry.com)的区别2、

在 C++(www.cppentry.com) 构造函数中,虚函数调用会被编译器自动转为普通函数调用,而在 C# 构造函数中允许进行虚函数调用。C++(www.cppentry.com) 这样处理自然有它的原因——在 C++(www.cppentry.com) 中,构造函数执行完成后对象才初始化好,对于多态对象来说,也就意味着构造函数在背后执行了很重要的一件事情——初始化对象的虚函数表。

如果我们在基类的构造函数中调用了虚函数,则因为此时对象的虚函数表仍旧是基类的虚函数表,所以无法进行正确的虚函数调用。也就是这个原因,通常我们应该避免在构造函数中调用虚函数,因为它违背了虚函数的语义。而在 C# 中,在对象的构造函数执行之前对象的类型信息就已经初始化好了,所以可以进行正常的虚函数调用。

C#构造函数与C++(www.cppentry.com)的区别的基本情况就向你介绍到这里,希望对你学习C#构造函数与C++(www.cppentry.com)的区别有所帮助。

【编辑推荐】

  1. C#结构体变量学习浅谈
  2. 解析C#结构体指针
  3. C#指针使用简析
  4. C#结构学习的详细介绍
  5. 关于C#结构的一些认识
【责任编辑:李彦光 TEL:(010)68476606】

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇17.5.2 拥有窗口和寄宿控件(1) 下一篇使用C# Win32类库的简单示例:从B..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: