如何在同一行定义C++默认构造函数与自定义构造函数?
C++继承类构造函数问题解答
一、你尝试的Circle类构造写法是否正确?
完全正确。你用类内初始化列表+默认参数的方式实现构造函数,和教授分开声明、类外定义的写法功能完全一致,而且更简洁高效:
- 初始化列表
radius(r)直接完成成员变量的初始化,比构造函数体内赋值的效率更高,是C++推荐的初始化方式; - 默认参数
double r = 1.0放在类内构造函数声明(同时也是定义)处,符合C++语法规范。
二、Cylinder构造函数的语法错误修正
你写的Cylinder(double r, double len) : length(len) this->radius(r) {}存在两个核心问题:
- 初始化列表的多个初始化项必须用逗号分隔,不能直接连写;
- 基类的
radius成员不能直接在派生类初始化列表中赋值,必须通过调用基类构造函数来初始化。
正确的Cylinder构造函数写法:
Cylinder(double r, double len) : Circle(r), length(len) {}
因为radius是基类Circle的protected成员,派生类可以访问,但初始化基类成员的标准方式是调用基类的构造函数,而非直接操作基类成员变量。
三、完整实现的其他小问题修正
你的完整代码里还有两个细节错误需要调整:
PI未定义:需要在代码开头添加#define PI 3.14159,或者包含<cmath>头文件并使用M_PI(部分编译器需提前定义_USE_MATH_DEFINES);Cylinder::calcVal()中使用了未定义的r:应该替换为基类的radius成员,因为派生类可以直接访问protected成员。
修正后的完整代码:
#define PI 3.14159 class Circle { protected: double radius; public: double calcVal(); Circle(double r = 1.0) : radius(r) {} }; double Circle::calcVal() { return (PI * radius * radius); } class Cylinder : public Circle { private: double length; double volume; public: double calcVal(); Cylinder(double r, double len) : Circle(r), length(len) {} }; double Cylinder::calcVal() { return (length * PI * radius * radius); }
内容的提问来源于stack exchange,提问作者Yeonari
相关产品推荐
相关产品推荐

