我有一个班级定义。我对一些构造函数行为感到困惑。以下是代码。
#include <iostream>
#include <cstdlib>
using namespace std;
class A
{
int i;
public:
void seti(int v) {cout << "Setting i\n"; i=v;}
void print() {cout << "i = " << i << endl;}
A(){};
A(int v) {cout << "Setting i in par-ctor to " << v << "\n"; i=v;}
A(A& o) {cout << "In copy ctor, changing i to " << o.i << "\n";i=o.i;}
A& operator=(A o) {cout << "In assignment op\n"; this->i = o.i; return(*this);}
};
int main()
{
A o1;
A o2(2);
A o3 = A(4);
A o4 = 35;
return(0);
}
我想知道为什么这段代码不能编译,除非
a)已注释定义的复制构造函数,或
b)定义的复制构造函数具有'const'
中的A& A(const A& o)
限定符或
c)删除了o3和o4的对象初始化。
关于(c)期望调用构造函数A(int),
实际的复制构造函数定义(没有const
的定义)如何与参数化(带有int)构造函数冲突?
答案 0 :(得分:6)
首先看一下:
A o3 = A(4);
A(4)
创建一个临时对象。这个表达式是一个右值。右值不能绑定到const
之类的非A&
左值引用,因此无法选择复制构造函数。更好的复制构造函数声明具有const A&
,因此它也可以从rvalues构造。这就是你(b)修复工作的原因。
同样的问题在这里表现出来:
A o4 = 35;
在复制初始化(使用=
)时,构造对象的临时对象,然后将其复制到您声明的对象中。所以这相当于:
A o4 = A(35);
因此表现出与上述相同的问题。