c ++构造函数和派生对象

时间:2017-05-13 15:21:48

标签: c++ class constructor

我得到了这段代码并想知道为什么在Class Cylinder行

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

不是

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

我的意思是双人被移交,基地是一个圆筒,不应该是base.radius?

// 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;
}

3 个答案:

答案 0 :(得分:3)

  

我得到了这段代码并想知道为什么在Class Cylinder行

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

不是

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

调用base.radius (r)无效,因为它是private的{​​{1}}成员。 即使它不是Circle,您也无法在构建初始化列表中访问它 使用private构造函数来初始化Circle是完全没问题的。

答案 1 :(得分:1)

首先,代码中没有继承。其次,当你调用radius构造函数时,会构造它的成员。由于Cylinder没有默认构造函数,因此必须确保在构造Circle期间调用Cylinder的构造函数。如果你有

Circle

编译器会抱怨Cylinder(double r, double h) : height(h) {} 缺少默认构造函数,因为如果你没有显式调用构造函数,那么Circle将使用

构造
Circle

不存在(因为Circle::Circle() 声明了不同的构造函数而被删除)。还

Circle

无法正常工作因为半径在Cylinder(double r, double h) : base.radius (r), height(h) {} 中是私有的,因为您只能在初始化列表中初始化Circle的成员(甚至不允许基类的成员)。

答案 2 :(得分:1)

首先,这里的名字base非常非常糟糕;你的Circle对象不是基础!!

而且,不,类不能直接初始化其成员(或真实基础的成员)的成员。这将是一种利益冲突,责任混乱,敏感的冲突。

类提供接口来管理它,该接口由函数组成,而不是直接访问成员。如果你进入并改变Circle的数据而不知道它就会有多么混乱!

使用构造函数初始化对象,让构造函数执行它认为正确的操作。在这种情况下,构造函数确实会按照您的意图设置radius成员。

了解black boxes