2012-10-04 39 views
1

我必須寫一個新的類成員像有靜態const成員時賦值運算符?

class A 
{ 
    static int i; 
    const int j; 
    char * str; 
    ... 
    ... 
}; 

現在我想寫賦值運算符吧。

A& A::operator=(const A& rhs) 
{ 
    if(this != rhs) 
    { 
     delete [] str; 
     str = new char[strlen(rhs.str)+1]; 
     strcpy(str, rhs.str); 
    } 
    return * this; 
} 

是不是?我將忽略靜態和常量成員(?)。

+1

'str = new char [strlen(rhs.str)+1];'*「對不對?」 - 不,它不是,'std :: string '是。 –

+1

我可能會建議[複製和交換成語](http://stackoverflow.com/a/3279550/201270)爲assigment運算符更好的異常安全?此外:使用'char *'而不是'std :: string'的任何緊迫原因?如果不是,我會強烈建議使用它。如果您需要'char *':與手動內存管理相比,智能指針幾乎總是更好的選擇。 – Grizzly

回答

8

賦值操作符將一個對象複製到另一個對象中。由於所有相同類型的對象共享相同的靜態成員,所以沒有理由複製靜態成員。

const成員是另一回事。你不能(不應該)改變它們,但是如果兩個對象對於一個const成員有不同的值,將一個對象複製到另一個對象可能不是一個好主意; const成員將沒有正確的值。這就是爲什麼編譯器不會爲具有const成員的類生成複製賦值運算符。所以你首先必須確定複製這樣的對象是有意義的,即使const成員的值不正確;然後問自己爲什麼它有const成員,如果他們不影響它的行爲。

參考文獻也是如此。 (是的,這裏有一個回聲)

+0

「這就是爲什麼編譯器不會爲具有const成員的類生成複製構造函數或複製賦值運算符。」編譯器在具有const屬性的成員的情況下生成複製構造函數。 #include using namespace std; class base { \t public: \t const int i; \t public:base():i(10){std :: cout << i << endl;} \t base&operator =(const base&b){return * this;} \t // base(const base&b ):i(bi){} }; int main() { \t \t base b1; \t base b2 = b1; std :: cout << b2.i << endl; } – Sandeep

+0

@Sandeep - 你是對的,謝謝。固定。 –

4

靜態成員不屬於單個對象,因此您不需要複製這些對象。

const成員不能改變,所以你真的不能做一個適當的副本。也參考。

相關問題