C++调用默认构造函数而非拷贝构造函数

7

我正在尝试为我的Arduino编写程序,但是当我将一个Item对象传递给另一个Holder对象时,我不明白发生了什么。我构建了一个简单的示例:

class Item {
  public:
    int property;

    Item() {
      Serial.println("parameterless constructor called");
      this->property = 2;
    }

    Item(int property) {
      this->property = property;
      Serial.println("right constructor called");
    }
};

class Holder {
  public:
    Item someitem;

    Holder(Item& someitem) {
      this->someitem = someitem;
    }
};

void setup() {
  Serial.begin(9600);

  Item someitem = Item(1);
  Serial.println(someitem.property);

  Holder hold = Holder(someitem);
  Serial.println(hold.someitem.property);
}

void loop() {

}

控制台上的输出为:

right constructor called
1
parameterless constructor called
1

我不理解为什么会首先调用无参构造函数(在我的理解中,我并没有创建一个新对象),也不明白为什么它既不改变当前对象也不创建一个新对象。编译器禁止省略无参构造函数。


1
当编译器给出错误提示时,你应该修复这些错误。例如,“编译器会阻止忽略无参数构造函数”。 - user2249683
@DieterLücking 他确实做了,但是方法不对 :) - Roddy
1个回答

15

你忘记了在C++中如何初始化类成员 - 成员初始化列表:

Holder(Item const& someitem) : someitem(someitem) {}

在你的代码中,首先会对someitem 进行默认构造(在执行构造函数的{}块之前),然后使用赋值运算符。
复制构造函数不会被调用(并且它无法在已构造的对象上调用)。

2
谢谢!这个有效,还指引我去进一步阅读。看来我还是太过于想着Java了... - Dominik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接