初始化对象后,如何使用赋值运算符覆盖C++中的类对象



我希望能够做这样的事情

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,它只执行按位复制)。

我逐步完成了我的程序,它甚至没有运行赋值运算符重载......

如果您确实声明并定义了复制赋值运算符,则编译器应调用它。您如何测试它是否未被调用?

最新更新