彩票走势图

C++和C#构造函数的异同

转帖|其它|编辑:郝浩|2010-06-28 13:42:20.000|阅读 642 次

概述:在 C++ 构造函数中,虚函数调用会被编译器自动转为普通函数调用,而在 C# 构造函数中允许进行虚函数调用。本文介绍C++和C#构造函数的区别 ,希望对大家有所帮助。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

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


 C++:
  struct Point {
  public:
  int X, Y;
  Point(int x, int y);
  Point(Point pt) : Point(pt.X, pt.Y) { } // 错误,C++ 不允许
  };
  C#:
  struct Point {
  public int X, Y;
  public Point(int x, int y);
  public Point(Point pt) : Point(pt.X, pt.Y) { } // 可以,C# 允许
  };

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

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

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

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

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


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:IT专家网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP