【问题标题】:Defining both Assignment operator and copy constructor定义赋值运算符和复制构造函数
【发布时间】:2014-03-30 07:32:36
【问题描述】:

假设我有一个类 A。我定义了一个复制构造函数和一个赋值运算符重载函数。当我这样做时

A 类; B类=A;

那么在定义Class B的时候,是调用拷贝构造函数还是赋值运算符呢?

提前致谢。

编辑: 对不起,我提到了错误的代码。应该是:

一个; a b=a;

【问题讨论】:

  • 你有没有试过在你的代码中设置一个断点来找出答案?
  • Class 是像 class Class{}; 还是您输入错误 class?不清楚。
  • @user2341104...对不起,我应该使用另一种表示法...这里它的类 Class A{};...查看编辑
  • 无论如何,在这两种情况下都会使用复制构造函数。

标签: c++ operator-overloading


【解决方案1】:

IIRC T t = value 调用复制构造函数,您可以通过在构造函数中输出字符串来确定使用哪种方法来验证这一点。 IIRC,当声明和赋值在同一行时,不叫赋值而是初始化。

另一方面,您发布的内容没有意义,您不能将一种类型分配给另一种类型,您只能分配给类型实例。

编辑:即使您有两种不同类型的案例(您的问题的上下文在这一点上并不清楚):

class A {};

class B {
public:
   B(const A& other)  { cout << "copy"; }
   B& operator=(const A& other) { cout << "assign"; }
};

int main() {
   A a;
   B b = a; // copy con
   B b1(a); // same as above
   b = a;   // assign op
}

即便如此,当“复制构造函数”和赋值运算符都采用另一种类型时,仍然会调用复制构造函数而不是赋值运算符。

【讨论】:

    【解决方案2】:

    假设你的意思实际上是这样的:

    A a;
    A b = a;
    

    复制构造函数被调用。该标准允许= 在此用法中具有此特殊含义。

    【讨论】:

    • 这是由于隐式构造函数调用。您可以使用任何隐式转换构造函数来做到这一点。
    • @NeilKirk 虽然我没有搜索标准以证明没有先例,但我冒着风险将复制构造函数称为“隐式”没有意义,因为隐式/显式与控制有关从不同的类型构造。 (使用了术语“隐式声明”和“隐式定义”但不相关)。很好的观察,它也允许隐式构造函数。干杯。
    • 您可以显式声明它以防止这种语法。
    【解决方案3】:

    用两者创建一个简单的类,并通过在两者中设置断点来调试执行的函数。然后你会看到,你也会学到一点调试。

    【讨论】:

      【解决方案4】:

      让我们试试吧!

      #include <iostream>
      
      class A {
       public:
        A() {
          std::cout << "default constructor\n";
        }
        A(const A& other) {
          std::cout << "copy constructor\n";
        }
        A& operator=(const A& rhs) {
          std::cout << "assignment operator\n";
          return *this;
        }
      };
      
      int main(int argc, char** argv) {
        std::cout << "first declaration: ";
        A a;
        std::cout << "second declaration: ";
        A b(a);
        std::cout << "third declaration: ";
        A c = a;
        std::cout << "fourth declaration: ";
        A d;
        std::cout << "copying? ";
        d = a;
        return 0;
      }
      

      打印出来:

      first declaration: default constructor
      second declaration: copy constructor
      third declaration: copy constructor
      fourth declaration: default constructor
      copying? assignment operator
      

      这里的工作示例:http://codepad.org/DNCpqK2E

      【讨论】:

        【解决方案5】:

        当您定义一个新对象并为其分配另一个对象时。它调用复制构造函数。 例如, 复制构造函数调用:

        Class A;
        Class B=A;
        

        赋值运算符调用:

        Class A;
        Class B;
        B=A;
        

        您始终可以对此进行测试,方法是在这两种方法中编写“打印”语句来找出正在调用的方法。

        希望对您有所帮助...

        【讨论】:

        • @user2341104:假设有一个名为Class的class,它是默认可构造、可复制构造和可赋值的,这段代码有什么问题?
        • 好吧,不是很清楚 OP 是什么意思,如果它实际上是一个名为 Class 的类或实际关键字。特别是对“实例”使用大写,这是该类型的常见做法。
        • @user2341104 显然,我可以......我为该类使用了“类”这个名称,因为问题包含的正是它。否则我不会,因为这是一种不好的做法。
        • @user2341104,如果还不清楚的话,这是代码示例。#include using namespace std;类类{ int a; public: Class(){ cout
        • 是的,你的意思很清楚,只是不清楚 OP 的意思。我更倾向于假设他拼错了 class,实际上是在问如果你在初始化语句中使用另一种类型会发生什么。
        猜你喜欢
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多