C++ 在C+中初始化派生类参数+; #包括 甲级{ int x,y; 公众: A(int x=0,int y=0):x(x),y(y){ std::cout
如果要删除输入错误并添加一个带有一个B类参数的构造函数,则代码编译成功C++ 在C+中初始化派生类参数+; #包括 甲级{ int x,y; 公众: A(int x=0,int y=0):x(x),y(y){ std::cout,c++,C++,如果要删除输入错误并添加一个带有一个B类参数的构造函数,则代码编译成功 #include <iostream> class A { int x, y; public: A(int _x = 0, int _y = 0) : x(_x), y(_y) { std::cout << "Constructeur de A \n"; std::cout << "x = " << x << "
#include <iostream>
class A {
int x, y;
public:
A(int _x = 0, int _y = 0) : x(_x), y(_y) {
std::cout << "Constructeur de A \n";
std::cout << "x = " << x << ", y= " << y << std::endl;
}
};
class B : A {
int d;
public: B(int x, int y, int _d=2) : A(x,y), d(_d) {
std::cout << "Constructeur de B \n";
std::cout << "d = " << d<< std::endl;
}
};
类A具有默认构造函数。它唯一显式定义的构造函数是该类的默认构造函数
代码也使用联机MS C++编译器编译。 至于这个错误消息
“B”:没有合适的默认构造函数可用 那么类B确实没有默认的构造函数Constructeur de A
x = 0, y= 0
Constructeur de B( int )
d = 1
B(int d=0):d(d)
{
STD::CUT< P>在 B< /Cudio>构造函数中,没有提供默认参数,C++不会从使用它们的角度来猜测它们。
B( int d = 0 ) :d( d )
{
std::cout << "Constructeur de B( int ) \n";
std::cout << "d = " << d<< std::endl;
}
或者提供另一个真正的默认构造函数:
B(int x = 0, int y = 0, int _d = 0): A(x, y), d(_d) {
你的代码编译得很好。
如果您只想调用B
的构造函数并给出d
,您应该为它编写一个构造函数:
B(int _d = 0): A() /*will use A(x=0,y=0)*/, d(_d) {
例如,用bb(1);
调用构造函数。但是编译器说:
“B”:没有合适的默认构造函数可用
因此,您必须像这样调用B
的构造函数:bb;
,它与bb=B()
(显式)相同。如果没有提供构造函数,它将调用编译器自动生成的默认构造函数。您已经提供了一个构造函数,因此可以编写默认构造函数,或者更优雅地强制编译器生成它(C++11):
如果在容器中使用了B
,则容器可以调用B
的默认构造函数
你不必对A
做同样的操作,因为它已经有了一个默认构造函数。用与构造函数参数相同的名称来调用你的成员变量是非常混乱的。似乎编译-@MathematicalIAN1975我不同意。我看不出问题所在。你能展示一下你调用B
构造函数的代码吗?因为它是nds,这不是@MathematicalIAN1975,对成员变量使用与初始化这些变量的构造函数参数相同的名称是一种正常的技术。我发现这比在构造函数参数名称上加上“缺点”更可取。
B(int _d = 0): A() /*will use A(x=0,y=0)*/, d(_d) {
public: B(int d) :d(d){...}
B() = default;