将参数与用户定义的类型参数一起使用,而不声明该类型的默认参数



这就是发生的事情(我简化了问题以更容易看到(:

#include<iostream>
class number_holder{
public:
int value;
number_holder(int value_to_set){
this->value=value_to_set;
}
};
class number_holder_pair{
public:
number_holder first;
number_holder second;
number_holder_pair(number_holder first,number_holder second) 
{
this->first=first;
this->second=second;
}
};

我知道将number_holder(){}添加到number_holder类中可以解决问题,但为什么需要这样做呢?

在此构造函数中:

number_holder_pair(number_holder first, number_holder second)
{  // <--
this->first=first;
this->second=second;
}

在到达标记行之前,必须初始化所有成员。然而,number_holder没有默认的构造函数,因此firstsecond成员不能被默认构造,代码也不会编译。

正如您所注意到的,添加一个默认构造函数:

number_holder() {}

解决了这个特殊的问题,并允许代码进行编译。请注意,此修复程序并不完全正确,因为您的value成员仍未初始化。相反,你应该这样做:

int value = 0;
number_holder() = default;

但是,您不一定必须提供默认构造函数,只要在达到number_holder_pair构造函数的定义之前初始化所有number_holder成员:

number_holder_pair(number_holder first,number_holder second)
: first(first), second(second) {}

此语法称为成员初始值设定项列表。

最新更新