【问题标题】:C++ calls default constructor instead of copy constructorC++ 调用默认构造函数而不是复制构造函数
【发布时间】:2016-03-25 06:21:07
【问题描述】:

我正在尝试为我的 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

我不明白为什么首先调用无参数构造函数(据我所知,我不是在创建新对象),以及为什么它既不更改当前对象也不创建新对象。编译器会阻止省略无参数构造函数。

【问题讨论】:

  • 您应该已经修复了编译器给出的错误“编译器会阻止省略无参数构造函数。”
  • @DieterLücking 他做到了,但是方法不对 :)

标签: c++ oop constructor


【解决方案1】:

你忘记了我们如何在 C++ 中初始化类成员 - member initializer lists

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

在您的代码中,someitem 首先是默认构造的(在执行进入构造函数的 {} 块之前),然后您使用赋值运算符。

复制构造函数没有被调用(并且它不能在已经构造的对象上)。

【讨论】:

  • 谢谢!这行得通,并指出我要进一步阅读。看来我还是在java中想太多了……
猜你喜欢
  • 2013-05-06
  • 2020-05-14
  • 2021-08-31
  • 2017-07-28
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多