程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C++和C#構造函數的區別

C++和C#構造函數的區別

編輯:C#入門知識

(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# 中,在對象的構造函數執行之前對象的類型信息就已經初始化好了,所以可以進行正常的虛函數調用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved