[英]How can I overwrite a Class Object in C++ using the Assignment Operator, after the Object has already been initialized?
我希望能夠做這樣的事情
MyClass my_class;
vector<MyClass> my_vector; // Imagine this is already populated
my_class = my_vector[0];
我想我需要像這樣為 MyClass 編寫一個賦值運算符
MyClass& operator=(const MyClass& rhs);
我逐步完成了我的程序,它甚至沒有運行賦值運算符重載......
我在這里做錯了嗎?
賦值運算符必須定義為成員函數,如下所示:
class MyClass {
...
public:
MyClass& operator=(const MyClass& rhs) {
....
return *this;
}
};
即使未填充向量,它也應該運行MyClass::operator=
賦值運算符。 但是在訪問rhs
時它會導致未定義的行為(段錯誤)。
它不運行賦值運算符,也許它被優化掉了,如果在編譯時啟用了優化,並且從不使用my_class
。
從技術上講,您的代碼沒有任何問題(假設您在使用my_vector[0]
時確實沒有訪問越界)。 行my_vector[0]
通過引用返回一個MyClass
對象,然后在下一行分配
my_class = my_vector[0];
使用默認的MyClass.operator=
。 如果您沒有定義復制賦值運算符,編譯器會為您隱式定義一個(除非您定義了移動語義運算符)。 默認賦值運算符會逐個成員進行復制(即,它調用每個成員的賦值運算符;對於 POD,它只是進行逐位復制)。
我逐步完成了我的程序,它甚至沒有運行賦值運算符重載......
如果您確實聲明並定義了一個復制賦值運算符,那么編譯器應該調用它。 你是如何測試它沒有被調用的?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.