2013-06-02 60 views
5

我剛剛在Cprogramming.com上看到隨機頁面,並注意到Constructors and Destructors教程/示例頁面。他們使用定義構造函數的方法如下:這個構造函數定義有什麼好處

class String 
{ 
    private: 
     char *str; 
     int size; 
    public: 
     String() : str(NULL), size(0) { } // <- This statement 
     String(int size) : str(NULL), size(size) { // <- And this one 
      str = new char[size]; 
     } 
} 

我一直在使用構造的良好的老式定義與魔法this指針:

String() { 
    this->str = NULL; 
    this->size = 0; 
} 
String(int size) { 
    this->size = size; 
    this->str = new char[size]; 
} 

是否有任何額外的好處在明顯較小的代碼旁邊的第一個聲明中(較少的行數)?

PS:自從我上次在C++中編寫了一些東西以來,已經有好幾年了。

+1

http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list –

回答

11

這些都是constructor initialization lists,併爲基本類型有關於你正在使用的形式,這是基於分配而不是初始化沒有區別。

然而,對於用戶定義的類型可能存在之間的(也許和語義)的性能方面的差異:

  1. 默認構造的對象和然後給它分配的值,並且
  2. 用該值直接初始化它。

而且,你不必爲那些沒有違約,constructible除了使用成員初始化列表初始化它們類型選擇,你沒有選擇。const和參考成員要麼,必須立即初始化。在C++

0

構建對象在三個步驟中進行:

  1. 存儲器會獲得性
  2. 成員變量被初始化
  3. 執行構造函數。

構造定義String() : str(NULL), size(0) {}分配在步驟2

構造定義String() { this->str = NULL; this->size = 0; }執行此步驟中的適當的值到變量3.第2步是,然而,仍然執行。所以這種爲成員變量分配適當的值效率較低。

1

我和你一樣,揹着舊拼貼知識這個用法看起來很奇怪。但是,然後明白,通過使用這種技術,自定義類實現在運行時提供更好的性能。而here是關於C++之父初始化列表的一個長篇解釋。

相關問題