gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:17:04 28 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

关于C++ 调用默认构造函数而不是复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34357345/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com