为什么构造函数在某些情况下不起作用

Why constructor does not work in some cases?

本文关键字:情况下 不起作用 构造函数 为什么      更新时间:2023-10-16

我有一个类定义。我对一些构造函数的行为感到困惑。代码如下:

#include <iostream>
#include <cstdlib>
using namespace std;
class A
{
  int i;
public:
  void seti(int v) {cout << "Setting in"; 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 opn"; 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的对象初始化。

对于期望调用构造函数A(int)的(c),

实际的复制构造函数定义(没有const的那个)如何与参数化的(带int的)构造函数冲突?

先看这里:

A o3 = A(4);

A(4)创建临时对象。这个表达式是一个右值。右值不能绑定到非const的左值引用(如A&),因此不能选择复制构造函数。一个更好的复制构造函数声明有一个const A&,这样它也可以从右值构造。这就是为什么你的(b)修复工作。

同样的问题出现在这里:

A o4 = 35;

在复制初始化(使用=)中,构造对象的临时对象,然后将其复制到您声明的对象中。这相当于:

A o4 = A(35);