我希望能够做到这样的事情
MyClass my_class;
vector<MyClass> my_vector; // Imagine this is already populated
my_class = my_vector[0];
我想我需要为MyClass编写一个赋值运算符,如此
MyClass& operator=(const MyClass& rhs);
我完成了我的程序,它甚至没有运行赋值运算符重载...
我在这里做错了吗?
答案 0 :(得分:0)
从技术上讲,您的代码没有任何问题(假设您在使用my_vector[0]
时确实没有访问越界)。行my_vector[0]
通过引用返回MyClass
对象,然后在下一行中分配
my_class = my_vector[0];
使用默认MyClass.operator=
。如果您没有定义复制赋值运算符the compiler defines one for you implicitly(除非您定义了移动语义运算符)。默认赋值运算符执行逐个成员的复制(即,它调用每个成员的赋值运算符;对于POD,它只执行逐位复制)。
我完成了我的程序,它甚至没有运行赋值运算符重载...
如果您确实声明并定义了一个复制赋值运算符,那么编译器应该调用它。你是如何测试它没有被调用的?
答案 1 :(得分:-1)
赋值运算符必须定义为这样的成员函数:
class MyClass {
...
public:
MyClass& operator=(const MyClass& rhs) {
....
return *this;
}
};
即使没有填充向量,它也应该运行MyClass::operator=
赋值运算符。但是当访问rhs
时,它会导致未定义的行为(段错误)。
它没有运行赋值运算符,如果在编译时启用了优化,它可能已被优化,并且永远不会使用my_class
。