如何在同一行定义默认构造函数和用户定义构造函数?

Yeo*_*ari 1 c++ inheritance constructor class object

在我的大学课堂上,我们正在处理继承问题,尽管我教授的代码让我感到困惑并且似乎有点不对劲。

class Circle
{
  protected:
    double radius;
  public:
    Circle(double = 1.0);
    double calcval();
};

Circle::Circle(double r)
{
  radius = r;
}
Run Code Online (Sandbox Code Playgroud)

在这里,她在类中创建一个默认构造函数,然后在类外部创建一个单独的用户定义构造函数。当我最初看到这一点时,我认为必须有一种方法可以更有效地做到这一点,从而占用更少的空间,使代码更具可读性。

经过一些在线搜索后,我找到了一些我尝试过的资源,尽管我仍然遇到一些错误。这是我尝试过的“Circle”类的构造函数。

class Circle
{
    protected:
        double radius;

    public:
        double calcVal();

        Circle(double r = 1.0) : radius(r) {}
};
Run Code Online (Sandbox Code Playgroud)

它是否正确?我试图使默认构造函数设置 radius = 1.0 并有一个构造函数将 radius = 设置为“r”(用户输入)。

我们还有另一个派生类“Cylinder”,我尝试做类似的事情但收到错误。

这是我教授的实现。

class Cylinder : public Circle
{
  protected:
    double length;
    double volume;
  public:       
    Cylinder(double r, double len);
    double calcval();
};

Cylinder::Cylinder(double r, double len){
    length =len;
    this->radius =r;
}
Run Code Online (Sandbox Code Playgroud)

然后这就是我尝试的。

class Cylinder : public Circle
{
    private:
        double length;
        double volume;
    public:
        double calcVal();

        Cylinder(double r, double len) : length(len) this->radius(r) {}
};
Run Code Online (Sandbox Code Playgroud)

但是,我在“this”的开头收到一个错误,其中显示“需要一个“{””。

如果可能的话,我如何在同一行中创建默认构造函数和用户定义构造函数,以提高代码的可读性和简洁性?非常感谢您的阅读。

为了您的方便,我的整体实施。:)

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) : length(len) this->radius(r) {}
};

double Cylinder::calcVal()
{
    return (length * PI * (r * r));
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 6

在这里,她在类中创建一个默认构造函数,然后在类外部创建一个单独的用户定义构造函数。

不,她在类声明中声明默认构造函数,然后在类声明之外定义该构造函数的主体。这是完全合法且正确的代码。

我仍然收到一些错误

那是因为你的代码中有错误。

这是我尝试过的类“Circle”的构造函数......这是正确的吗?

在那个例子中,是的。

我们还有另一个派生类“Cylinder”,我尝试做类似的事情但收到错误...然后这是我尝试的...但是,我在“this”的开头收到一个错误,上面写着“expected a” {“。”

既然radius是 的成员Circle,您应该让Circle构造函数初始化radius。不要在派生Cylinder的构造函数中这样做。但是,您自己没有调用 的Circle构造函数,因此编译器会为您调用它,并传入其默认参数值。

,您的构造函数成员初始化列表中还缺少 a Cylinder,这是一个语法错误。

试试这个:

Cylinder(double r, double len) : Circle(r), length(len) {}
Run Code Online (Sandbox Code Playgroud)

话虽如此,代码中还有一些其他事情值得指出。

您的Cylinder类有一个volume从未初始化或使用的成员,因此应该将其完全删除。

Cylinder::calcVal(),内部r未定义。Circle它只是和构造函数中的局部变量Cylinder。您需要改用radius成员(就像如何使用成员Circle::calcVal()而不是构造函数参数一样),例如:Cylinder::calcVal()lengthlen

return (length * PI * (radius * radius));
Run Code Online (Sandbox Code Playgroud)

double calcVal();您在两个类中进行声明,Circle::calcVal()但未标记为virtual,因此Cylinder::calcVal()不会覆盖它。如果您要创建Circle*/Circle&引用一个Cylinder对象,然后调用calcVal()它,则只会Circle::calcVal()被调用,而不是Cylinder::calcVal()。因此,使Circle::calcVal()虚拟,例如:

virtual double calcVal();
Run Code Online (Sandbox Code Playgroud)

为了更好地衡量,Cylinder应该将其标记calcVal()override

double calcVal() override;
Run Code Online (Sandbox Code Playgroud)

由于您想降低类的复杂性,因此可以内联calcVal()这两个类,例如:

class Circle
{
    protected:
        double radius;

    public:
        virtual double calcVal() { return (PI * (radius * radius)); }

        Circle(double r = 1.0) : radius(r) {}
};

class Cylinder : public Circle
{
    private:
        double length;

    public:
        double calcVal() override { return (length * PI * (radius * radius)); }

        Cylinder(double r, double len) : Circle(r), length(len) {}
};
Run Code Online (Sandbox Code Playgroud)

然后,由于Circle::calcVal()Cylinder::calcVal()都计算相同的PI * radius * radius值,其中Cylinder只是将结果乘以length,您实际上可以调用Circle::calcVal()的内部Cylinder::calcVal()来完成常见的工作,例如:

double calcVal() override { return (length * Circle::calcVal()); 
Run Code Online (Sandbox Code Playgroud)