【问题标题】:What is the use of a constructor? [closed]构造函数有什么用? [关闭]
【发布时间】:2021-03-22 16:00:27
【问题描述】:

我没有完全理解构造函数的使用 例如:

class car
{
    public:
    string name;
    long int price;
    int mileage
    bool ownedByPlayer;
};

这里,我为什么要使用这样的构造函数,

class car
{
    public:
    string name;
    long int price;
    int mileage
    bool ownedByPlayer;
    car()
   { 
       ownedByPlayer = false;
   }
};

如果我可以简单地定义变量ownedByPlayer 我已经声明它。喜欢:bool ownedByPlayer = false;?

【问题讨论】:

  • 对于无参数构造函数没有太大区别,但您可以编写带参数的构造函数。例如,您可以编写一个构造函数car(string name, long price, int mileage, bool owned),将成员变量的值设置为传递给构造函数的值。
  • 无用的构造函数有什么用? ...有时构造函数实际上需要做一些事情来构造一个对象
  • C++ 不允许你在 C++11 之前的类中执行 bool ownedByPlayer = false;
  • 这能回答你的问题吗? Why we do need constructors?, Use of constructor in C++.
  • 您是在问为什么这个类必须始终有一个构造函数,还是在问您是否需要自己编写该构造​​函数,或者编译器生成的默认构造函数是否足够好?

标签: c++ class constructor


【解决方案1】:

在您的情况下,无需编写构造函数。实际上,建议不要编写只使用默认值初始化成员的构造函数。虽然正确的方法是使用成员初始化列表:

car() : ownedByPlayer(false) {}

从 C++11 开始,您可以使用默认成员初始化器:

class car {
    // ...
    bool ownedByPlayer = false;
    // ...
};

有时构造函数实际上需要做一些事情。考虑一个 car 在构造后在某处注册自己,那么您的类可能如下所示:

class car
{
    public:
    string name;
    long int price;
    int mileage;
    car(string name,long int price, int mileage) : name(name),price(price),mileage(mileage) {
        CarRegistrationFacility::register_car(*this);
    } 
};

实际上,我发现很难为构造函数创建一个不只是初始化成员的示例,因为构造函数就是这样做的。但是,当您的构造函数做的不止这些时,那么“更多”就会发生在构造函数的主体中。

【讨论】:

  • 当你记得你可以重载构造函数时,构造函数的使用会大大增加。 `std::vector 有大约 10 个构造函数。
  • @MooingDuck 好点,虽然我正处于删除它的边缘。如果问题没有关闭,也许我稍后会改进它
  • template <typename... NameArgs, typename... PriceArgs, typename... MileageArgs> car(std::piecewise_construct_t, std::tuple<NameArgs&&...> nameArgs, std::tuple<PriceArgs&&...> priceArgs, std::tuple<MileageArgs&&...> mileageArgs) 这样的东西,我承认对于这里定义的car 来说完全是矫枉过正?
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2013-01-28
  • 2015-11-16
相关资源
最近更新 更多