2012-10-12 79 views
2

我自己寫字符串類。我不知道如何編寫Сopy構造函數。 我有這樣的代碼。構造函數不起作用

class S { 
     private: 
      char *string; 
      int l; 
     public: 
      S::S(const S &s){ 
       string = new char[l+1]; 
       memcpy(string,s.string,l+1); 
       } 
}; 

編譯器沒有給出任何錯誤,但.exe通過未知錯誤關閉。我試過它在main()函數中使用。

S pop("Q6"); 
S str(pop); 

所以我很期待你的幫助。

回答

8

在你的拷貝構造函數

string = new char[l+1] 

l尚未初始化字符串的長度,所以它可以是任何價值。在使用它之前,您應該初始化它(通過從s.l複製值)。

+0

是的,你說得對。我加了l = s.l;現在它的作品正確。 – Rocketq

+0

這回答了這個問題,但是imho應該提及複製分配和銷燬,以及智能指針如何成爲更好的開始。這個階級就像是一個時間炸彈。 –

3

一旦你有一個拷貝構造函數,你也需要提供一個賦值操作符和一個析構函數。這被稱爲rule of three

但更好的辦法是使用智能指針,那麼你就需要注意的是,三的規則變成了rule of zero

你也忘了初始化l。更重要的是,memcpy在C++代碼中沒有真正的地方。使用標準庫算法而不是C函數(在這種情況下,std::copy)。

+0

謝謝您的建議。我會盡力關注他們。並且我不知道C++複製函數)) – Rocketq

2

試試這個

public: 
    S::S(const S &s) : l(s.l) 
    { 
     string = new char[l+1]; 
     memcpy(string,s.string,l+1); 
    } 
+0

爲什麼不初始化初始化列表中的字符串? –

+0

Thx,現在它的作品。但是什麼意思:l(s.l) – Rocketq

+0

@Rocketq,它是初始化列表。例如,請參閱http://www.cprogramming.com/tutorial/initialization-lists-c++.html。 – nothrow

1

問題出在l+1l未初始化。你需要分配它,如使用前的l = s.l;

相關問題