賦值運算符(=
)是否需要總是將右值複製到左值中,還是完全依賴於它所操作的操作數的類型?對不起,如果它是愚蠢的,但無論我讀什麼,它被寫入,它只是將右邊的值複製到左邊。我想讓我的事實正確。不同類型操作數的賦值運算符
請在C++中給出一個例子。
賦值運算符(=
)是否需要總是將右值複製到左值中,還是完全依賴於它所操作的操作數的類型?對不起,如果它是愚蠢的,但無論我讀什麼,它被寫入,它只是將右邊的值複製到左邊。我想讓我的事實正確。不同類型操作數的賦值運算符
請在C++中給出一個例子。
是否有必要賦值運算符(=)始終將右值複製到左值中。
號對於用戶定義的類型它沒有這樣的事情。相反,它會調用相應的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"
}
正如您所看到的,賦值運算符可以自由地執行它認爲合適的任何動作。在這種情況下,它顯然不僅僅是一個「複製」。
不同的語言使用不同的概念
Java和C++和C +是的,這是除非有其他函數
T-SQL重載賦值=變成一個試驗和分配
在C++中不需要有一個賦值,因爲賦值運算符可以超載。 –
這真是完全取決於你如何實現賦值操作符和類的組成......在C++中,POD類或結構體的缺省編譯器創建的賦值操作符方法將簡單地將RHS對象的一點點拷貝拷貝到LHS對象,但用戶定義的賦值運算符可以做任何你想要的。它將永遠屬於LHS對象,但它不需要進行任何複製,或者如果您願意,可以有任何數量的副作用。
這不是C++中的缺省賦值操作符。一個C++默認賦值操作符在每個子對象(基和成員變量)上調用'operator ='。 –
好了,對不起,不是不夠具體...我澄清我的發言意味着POD類型... – Jason
PODness使一個巨大的差異,以確保萬無一失。 –
複製過於籠統。
在C語言中,如果分配給指針,則不會複製實際值,但會保存存儲右側操作數的內存地址。
int *ptr = (int *)malloc(sizeof(int *));
*ptr = 1; // points at whatever address 1 has
ptr = 1; // points at address 1, containing ????
你可以說*拷貝*內存地址的*值*。 –
可以重載賦值運算符但是請你但在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上的三條規則。
您必須選擇語言才能獲得答案。目前*過於廣泛*,因爲將問題作爲**解決問題的理由之一不是真正的問題**。 – Griwes
確實。非常廣泛的問題。 – jsalonen
@Griwes Okay.Edited – tez