当前位置:  开发笔记 > 编程语言 > 正文

C++调用默认构造函数而不是复制构造函数

如何解决《C++调用默认构造函数而不是复制构造函数》经验,为你挑选了1个好方法。

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

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

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

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

不调用复制构造函数(并且它不能在已构造的对象上).


谢谢!这有效,并指出我要进一步阅读.看起来我在Java中的想法太多了......
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有