假设我有一个A类。我已经定义了一个复制构造函数和赋值运算符重载函数。当我做的时候
A类; B级= A;
然后在定义B类时,是调用了复制构造函数还是赋值运算符?
提前致谢。
修改 对不起,我提到了错误的代码。它应该是:
A; A b = a;
答案 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”语句来测试它,以找出被调用的方法。
希望它有所帮助...