【问题标题】:C++ operator = problemsC++ 运算符 = 问题
【发布时间】:2012-09-06 11:49:48
【问题描述】:

我有一个 MyPoly 类,我在其中实现了自己的等号运算符 ( = )。 当我尝试此代码时,一切正常,并且正在调用我实现的 =。

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy;
copy = mp;

但是当我写这个时:

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp;

它不使用我实现的 = ,然后当调用析构函数时我得到一个运行时错误。

谁能解释为什么这些代码不同?

【问题讨论】:

  • 我认为在第二种情况下,使用复制构造函数而不是赋值运算符。
  • 我要走了,所以我没有时间给出完整的答案,但这是由于 C++ 使用符号 = 来表示两个 assignment(第一种情况)和初始化(第二种情况)。

标签: c++ operators


【解决方案1】:

这一行

MyPoly copy = mp;

是一个拷贝初始化,所以它不调用赋值运算符(你所说的“相等运算符”),而是调用拷贝构造函数,它有签名

MyPoly(const MyPoly&); 

并且由编译器生成,除非您提供自己的。至于运行时错误,您需要提供更多代码。但我可以推测,由于您已经编写了自己的赋值运算符,您可能正在处理一些动态分配的资源,在这种情况下,您应该遵循rule of three 并实现自己的复制构造函数和析构函数。如果你有 C++11 支持,你应该将它扩展到 rule of 5 并提供你自己的移动复制构造函数和移动赋值运算符。

【讨论】:

    【解决方案2】:

    这个

    MyPoly copy = mp;
    

    不是赋值,而是复制初始化。它使用复制构造函数,而不是赋值运算符。

    MyPoly copy(mp);
    

    直接初始化

    MyPoly copy;
    copy = mp;
    

    任务

    【讨论】:

      【解决方案3】:
      MyPoly mp = MyPoly(arr , 4); 
      
      MyPoly copy = mp;
      

      调用copy c-tor,而不是operator =。在这两种情况下都是copy initialization

      【讨论】:

        【解决方案4】:
        MyPoly copy = mp;
        

        等同于:

        MPoly copy(mp);
        

        同样,它调用复制构造函数而不是赋值运算符。在赋值运算符旁边创建一个复制构造函数总是一个好主意。

        【讨论】:

        猜你喜欢
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 2014-04-14
        • 2021-10-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多