我希望能够做这样的事情
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,它只执行按位复制)。
我逐步完成了我的程序,它甚至没有运行赋值运算符重载......
如果您确实声明并定义了复制赋值运算符,则编译器应调用它。您如何测试它是否未被调用?