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

时间:2015-04-12 00:11:13

标签: c++

我希望能够做到这样的事情

MyClass my_class;
vector<MyClass> my_vector; // Imagine this is already populated
my_class = my_vector[0];

我想我需要为MyClass编写一个赋值运算符,如此

MyClass& operator=(const MyClass& rhs);

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

我在这里做错了吗?

2 个答案:

答案 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