加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在构造函数体内调用成员对象的构造函数?

发布时间:2020-12-16 10:11:49 所属栏目:百科 来源:网络整理
导读:为什么我不允许使用以下语法在类的构造函数体中调用成员对象/不同类的构造函数? class Circle { double radius; public: Circle(double r) : radius(r) { } double area() {return radius*radius*3.14159265;}};class Cylinder { Circle base; double heigh
为什么我不允许使用以下语法在类的构造函数体中调用成员对象/不同类的构造函数?

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

顺便说一下,我知道我可以使用Cylinder(双r,双h)之类的成员初始化列表通过Cylinder(double,double)调用Circle :: Circle(double):base(r),height(r){}但仍然是什么编译器生成此错误的前一种方法有错吗?

Error Message

解决方法

问题是当C开始执行构造函数代码时,必须已经构造了所有成员变量(例如,如果你在构造之前调用Circle的方法怎么办?).

如果立即构造是一个问题,那么可能的解决方案是向您的成员添加默认构造函数和包含类的构造函数体中的using赋值.

你可以想象像int或double这样的本地类型确实有一个默认的构造函数,这就是你以后可以初始化它们的原因(但是请注意,对于该语言的许多丑陋的怪癖之一,int或double的默认构造函数实际上并不是这样的在这种情况下做任何事情并且你不允许对这样的成员做任何事情,除非给它赋值 – 例如,不允许读取它.

您不能在正文中使用base(r),因为它不是有效的语句…在带有左括号的名称之后仅用于函数调用,声明中的初始化或构造函数成员初始化列表中的成员初始化.

如果您为Circle提供默认构造函数,那么您可以这样做

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

但请注意,构建非工作对象以便以后修复它们的方法不是C的最佳方法.该语言喜欢这样的想法:如果一个对象被构造,那么它是可用的,只有在必要时才会考虑与它的偏差(C 11从移动构造函数的原始路径中稍微偏离……但这是另一个故事).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读