You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一行定义C++默认构造函数与自定义构造函数?

C++继承类构造函数问题解答

一、你尝试的Circle类构造写法是否正确?

完全正确。你用类内初始化列表+默认参数的方式实现构造函数,和教授分开声明、类外定义的写法功能完全一致,而且更简洁高效:

  • 初始化列表radius(r)直接完成成员变量的初始化,比构造函数体内赋值的效率更高,是C++推荐的初始化方式;
  • 默认参数double r = 1.0放在类内构造函数声明(同时也是定义)处,符合C++语法规范。

二、Cylinder构造函数的语法错误修正

你写的Cylinder(double r, double len) : length(len) this->radius(r) {}存在两个核心问题:

  1. 初始化列表的多个初始化项必须用逗号分隔,不能直接连写;
  2. 基类的radius成员不能直接在派生类初始化列表中赋值,必须通过调用基类构造函数来初始化。

正确的Cylinder构造函数写法:

Cylinder(double r, double len) : Circle(r), length(len) {}

因为radius是基类Circle的protected成员,派生类可以访问,但初始化基类成员的标准方式是调用基类的构造函数,而非直接操作基类成员变量。

三、完整实现的其他小问题修正

你的完整代码里还有两个细节错误需要调整:

  1. PI未定义:需要在代码开头添加#define PI 3.14159,或者包含<cmath>头文件并使用M_PI(部分编译器需提前定义_USE_MATH_DEFINES);
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:40:30