定义赋值运算符和复制构造函数

时间:2014-03-30 07:32:36

标签: c++ operator-overloading

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

A类; B级= A;

然后在定义B类时,是调用了复制构造函数还是赋值运算符?

提前致谢。

修改 对不起,我提到了错误的代码。它应该是:

A; A b = a;

5 个答案:

答案 0 :(得分:3)

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
}

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

答案 1 :(得分:2)

假设你的意思是:

A a;
A b = a;

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

让我们试一试!

#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

答案 4 :(得分:0)

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

Class A;
Class B=A;

分配操作员电话:

Class A;
Class B;
B=A;

你总是可以通过在两种方法中写一个“print”语句来测试它,以找出被调用的方法。

希望它有所帮助...