2013-04-04 98 views
0

基本上,在它的重載賦值操作符中調用一個類的構造函數是否可以接受的編程習慣/風格?如果不是,爲什麼不呢?在重載賦值運算符中調用構造函數?

實施例:

所以我有一個類,其具有3名數據成員,被稱爲「價值」的動態int數組,其保持了大量的數字,一個int length其指示在數的位數,&其指示號碼(動態數組的大小)的最大長度的int maxLength

這是我的構造與PARAM INT:

bigInt::bigInt(const int &rhs){ 
    //turn num_ into a string 'num' 
    stringstream ss; 
    ss << num_; 
    string num = ss.str(); 
    length = strlen(num.c_str()); 
    maxLength = (length - (length%16)) + 16; 
    value = new int[maxLength]; 
    for(int i=1; i<=length; i++){ 
     value[i-1] = num.at(length-i) - '0'; 
    } 
} 

這是我的重載阿西gnment運營商在其右手邊是一個普通的INT 此方法調用構造函數:

bigInt bigInt::operator=(const int &rhs){ 
    *this = bigInt(rhs); 
    return *this; 
} 

編輯:我想我應該有不同的措辭。我不是故意的拷貝構造函數,而是一個普通的構造與非類實例參數和重載賦值運算符,其中RHS是不是同一類型的賴氨酸

+0

你將如何做到這一點,它會如何幫助? – 2013-04-04 13:22:37

+2

一個例子會很有用。 – sharptooth 2013-04-04 13:22:40

+0

檢查瞭解詳細信息:http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom – SomeWittyUsername 2013-04-04 13:30:32

回答

0

相反的是更好的。這很好。

但是,不要忘了,在副本構造器則必須重做你在構造函數中做什麼;即初始化你的類中的任何變量,這在重載賦值操作符函數中是不必要的。

+2

呃,什麼? (填充) – 2013-04-04 13:26:05

+0

如果我理解正確,提問者詢問他是否可以從賦值運算符函數調用複製構造函數。我沒有看到這個問題,但是我做了相反的事情,因爲複製構造函數更一般,需要初始化東西。就像複製數組容器一樣。在繼續處理新對象中的其他函數之前,必須對其進行初始化。 – 2013-04-04 13:29:05

+0

不知何故,我無法想象如何調用'operator ='中的拷貝構造函數,也沒有標準的構造函數。但我可能太累了,我可能會錯過一些東西。關於相反的部分 - 可以在複製構造函數中調用'operator =',但是我沒有明白關於初始化和東西的觀點。無論如何。 – 2013-04-04 13:34:14

1

沒有什麼錯與調用在 實現賦值運算符的拷貝構造函數(除非拷貝構造函數 自己在分配方面實現 當然)。事實上,這是一個常見的習慣用法:做一個本地副本,然後 交換數據與當前實例。 (這當然, 假設你有一個專門的交換。只是打電話 對象本身std::swap在賦值運算符是 一個好主意。創建一個新的實例,然後交換 的各個組件對象往往是,或者創建一個自定義交換功能,交換組件,並調用 它。)

1

這不是一個不合理的方式來實現您的賦值運算符,因爲它允許您利用現有的代碼,並提供只要您的複製指派操作員能夠做到這一點,就可以提供有力保證值得注意的

兩點不過:首先,確保你的拷貝構造函數,拷貝賦值操作符和析構函數都實施得當,否則你會開始有內存管理的問題。其次,C++語言已經提供的元素,長度和最大長度類:這就是所謂的std::vector,如果你改變你的代碼中使用它,你不需要寫的拷貝構造函數,拷貝賦值運算符和析構函數完全可以,因爲他們會表現得很好!

而且,你的賦值運算符應參考返回(或者,如果你真的不想要鏈接,void)。按值返回有一天會導致一個錯誤,當鏈接分配不能按預期工作。

相關問題