gpt4 book ai didi

c++ - 当成员具有另一个类作为其类型时,构造函数中的成员初始化

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:25 29 4
gpt4 key购买 nike

最近开始学习C++,一直在用cplusplus.com的教程来学习。我进入了类部分,看到了如何在不在构造函数主体中键入成员的情况下初始化成员。起初这看起来很简单,但他们的例子让我感到困惑。在这里:

// member initialization
#include <iostream>
using namespace std;

class Circle {
double radius;
public:
Circle(double r) : radius(r) { }
double area() {return radius*radius*3.14159265;}
};

class Cylinder {
Circle base;
double height;
public:
Cylinder(double r, double h) : base (r), height(h) {}
double volume() {return base.area() * height;}
};

int main () {
Cylinder foo (10,20);

cout << "foo's volume: " << foo.volume() << '\n';
return 0;
}

让我感到困惑的部分是 Cylinder 类,具体来说:

Cylinder(double r, double h) : base (r), height(h) {}

在类的前面,声明了一个名为“base”的 Circle 类型的成员对象。然后,在圆柱体构造函数中,这个“基础”对象被设置为“r”,它是一个 double :

base (r), height(h) {}

我的问题是,当成员“base”的类型为“Circle”时,如何将其初始化为 double 值?此外,我尝试做(我认为的)本质上相同的事情,但我在构造函数的主体中初始化了“base”:

Cylinder(double r, double h)
{
base = r;
height = h;
}

这给我留下了编译错误:“错误:没有匹配函数来调用‘Circle::Circle()’”

如果有人能为我解决这个困惑,我将不胜感激。谢谢。

最佳答案

how could the member "base" be initialized to a double, when it is of type "Circle"?

成员初始化列表将为base调用适当的构造函数,而Circle有一个构造函数,它以double为参数,所以它可以工作.

base = r; 也编译通过,因为 r 可以通过上面的构造函数隐式转换为 Circle,然后 operator=(const Circle&)(由编译器隐式生成)将被调用。但是没有成员初始化列表base需要先由默认构造函数初始化,而Circle没有。这就是错误消息所说的内容。

关于c++ - 当成员具有另一个类作为其类型时,构造函数中的成员初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31445941/

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