关于c ++:有没有构造函数的类是否有意义?

Does it make sense to have a class without constructor?

我想知道如果派生类有一个没有构造函数的类是否有意义。如果没有,有没有一种方法可以做我想做的不同的事情?

我的情况如下:我希望用户只使用派生类,但这些类具有共同的数据成员和方法。

编辑:由于类存在默认的构造函数,这意味着用户总是可以直接创建一个Instrument实例,那么我该怎么做呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class instrument{
    public:
        double get_price();
        std::string get_udl();

    private:
        double m_price;
        std::string m_udl;

};

class stock : public instrument{
    public:
        double get_dividend();

    private:
        double m_dividend;
};

class option : public instrument{
    public:
        double get_strike();
    private:
        double m_strike;
};


I want the users to only use the derived classes, but those have data members and methods in common

让您的默认(或任何其他)委托人,但请使用protected访问权声明。现在只有派生类可以调用它。有效地使其仅在继承时可用。

1
2
3
4
5
6
7
8
9
10
11
12
13
class instrument{
    public:
        double get_price();
        std::string get_udl();

    protected:
        instrument() = default;

    private:
        double m_price;
        std::string m_udl;

};

这还避免了与使类抽象相关的开销。如果您不需要多态性,那么您不应该仅仅将它用于使类仅可用作基类。


有没有想过抽象类?

An abstract class is a class that is declared abstract—it may or may not include abstract methods. Abstract classes cannot be instantiated, but they can be subclassed.

这不是你要找的吗?


当没有定义默认构造函数时,编译器将自动为您生成一个,对基本类型的成员不做任何操作,并为结构/类类型的成员调用默认构造函数。

因此,结论是,没有任何构造函数的类是没有意义的,因为每当定义该类的实例时,必须至少调用一个(可以使用Deligate构造调用更多实例)。


对!当然有道理。因为当用户创建derivedclassinstance时,首先从derivedclassconstructor中调用parent类的constructor。即使没有你明确的称呼它。即使你没有创建一个parent类的defaultconstructor也会被调用。默认情况下

1
2
public constructor with no parameter is present in every class
if it has no overridden constructor.

是的,在创建derived class instance之后,父类的所有公共成员都将出现在derived class中。