我正在尝试为我的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++中初始化类成员 - 成员初始化列表:
Holder(Item const& someitem) : someitem(someitem) {}
在您的代码中,首先someitem
是默认构造的(在执行之前进入{}
构造函数的块),然后您使用赋值运算符.
不调用复制构造函数(并且它不能在已构造的对象上).