gpt4 book ai didi

c++ - 在没有默认构造函数的情况下创建派生对象

转载 作者:行者123 更新时间:2023-12-02 09:48:44 28 4
gpt4 key购买 nike

我在一个站点中进行了一次小型测试,然后遇到了这个问题。

#include<iostream.h> 
class Base
{
int x, y, z;
public:
Base()
{
x = y = z = 0;
}
Base(int xx, int yy = 'A', int zz = 'B')
{
x = xx;
y = x + yy;
z = x + y;
}
void Display(void)
{
cout<< x << " " << y << " " << z << endl;
}
};
class Derived : public Base
{
int x, y;
public:
Derived(int xx = 65, int yy = 66) : Base(xx, yy)
{
y = xx;
x = yy;
}
void Display(void)
{
cout<< x << " " << y << " ";
Display();
}
};
int main()
{
Derived objD;
objD.Display();
return 0;
}

我选择编译错误选择是因为我们要为构造函数实例化一个带有零参数的派生对象,并且我们定义了一个带有2个参数的对象。据我所知,如果我们定义一个构造函数我们的自我,编译器将不再提供默认构造函数。我运行代码并正确编译。有人可以解释一下,这让我真的很困惑。

最佳答案

这是因为您的c'tor中有默认参数,这意味着如果您不传入参数,则它将默认为参数。您的构造函数可以处理0,1或2个参数。

如果您更改:

Derived(int xx = 65, int yy = 66) : Base(xx, yy)


Derived(int xx, int yy) : Base(xx, yy)

那么你的编译将会失败

另外

由于您的c'tor只能与一个参数一起使用,因此您可能想使用 explicit:
explicit Derived(int xx = 65, int yy = 66) : Base(xx, yy)

当您不希望发生隐式转换时,这将不允许它们发生。仍然可以进行显式转换。如果删除默认值,则不需要这样做,因为您的 Controller 只能接受2个参数。

关于c++ - 在没有默认构造函数的情况下创建派生对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62370904/

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