2012-06-19 38 views
-2

賦值運算符(=)是否需要總是將右值複製到左值中,還是完全依賴於它所操作的操作數的類型?對不起,如果它是愚蠢的,但無論我讀什麼,它被寫入,它只是將右邊的值複製到左邊。我想讓我的事實正確。不同類型操作數的賦值運算符

請在C++中給出一個例子。

+4

您必須選擇語言才能獲得答案。目前*過於廣泛*,因爲將問題作爲**解決問題的理由之一不是真正的問題**。 – Griwes

+0

確實。非常廣泛的問題。 – jsalonen

+0

@Griwes Okay.Edited – tez

回答

2

是否有必要賦值運算符(=)始終將右值複製到左值中。

號對於用戶定義的類型它沒有這樣的事情。相反,它會調用相應的operator=函數。考慮這些類:

#include <iostream> 
struct Half { 
    int i; 
    void operator=(int j) { i = j/2; } 
}; 
struct Double { 
    int i; 
    void operator=(int j) { i = j*2; } 
}; 
int main() { 
    Half h; 
    h = 3; 
    Double d; 
    d = 3; 
    std::cout << h.i << " " << d.i << "\n"; 
    // Result is "1 6" 
} 

正如您所看到的,賦值運算符可以自由地執行它認爲合適的任何動作。在這種情況下,它顯然不僅僅是一個「複製」。

0

不同的語言使用不同的概念

Java和C++和C +是的,這是除非有其他函數

T-SQL重載賦值=變成一個試驗和分配

+1

在C++中不需要有一個賦值,因爲賦值運算符可以超載。 –

2

這真是完全取決於你如何實現賦值操作符和類的組成......在C++中,POD類或結構體的缺省編譯器創建的賦值操作符方法將簡單地將RHS對象的一點點拷貝拷貝到LHS對象,但用戶定義的賦值運算符可以做任何你想要的。它將永遠屬於LHS對象,但它不需要進行任何複製,或者如果您願意,可以有任何數量的副作用。

+0

這不是C++中的缺省賦值操作符。一個C++默認賦值操作符在每個子對象(基和成員變量)上調用'operator ='。 –

+0

好了,對不起,不是不夠具體...我澄清我的發言意味着POD類型... – Jason

+0

PODness使一個巨大的差異,以確保萬無一失。 –

0

複製過於籠統。

在C語言中,如果分配給指針,則不會複製實際值,但會保存存儲右側操作數的內存地址。

int *ptr = (int *)malloc(sizeof(int *)); 
*ptr = 1; // points at whatever address 1 has 
ptr = 1; // points at address 1, containing ???? 
+1

你可以說*拷貝*內存地址的*值*。 –

2

可以重載賦值運算符但是請你但在C++中通常的實現是這樣的:

class MyObject 
{ 
public: 
    MyObject& operator=(const MyObject& rhs) 
    { 
     if (this != &rhs) 
      x = rhs.x; 
     return *this; 
    } 

private: 
    int x; 
}; 

之所以這樣做是爲了讓自定義對象的簡單分配。由於用戶定義的類和結構可能很複雜,因此您需要提供一個自定義賦值運算符來完成指針成員的深層副本。

MyObject a; 
MyObject b; 
b = a; // calls assignment operator b.operator=(a); 

請注意,您不能在C和Java中重載運算符,這可能會有所不同。

編輯:

你可能想知道作爲Griwes指出的是,編譯器會爲您的用戶自定義對象的隱式賦值運算符,如果你沒有指定其他的事情。有時候你想定義或聲明它,只是爲了避免編譯器生成的默認行爲。

也有=令牌將實際調用例如拷貝構造函數,如果你修改我以前使用的情況下,像這樣的一些用法:

MyObject a; 
MyObject b = a; // this calls the copy constructor (also implicitly defined if not provided) 

它可能看起來像一個分配,但定製提供的操作員在上述情況下不會被調用。出於更多理由,當你做或不想定義一個賦值運算符時,請查看Wikipedia上的三條規則。

+0

值得關注的是'='在C++中,有時只需要調用同構造函數... – Griwes

+0

@Griwes:但這個問題詢問有關賦值運算符,的'='令牌沒有其他用途。 –

+0

@Griwes從技術上講,這將是複製構造函數,但我想保持它的上下文。 – AJG85