【问题标题】:Why should I use constructors if I can use get and set? [duplicate]如果可以使用 get 和 set,为什么还要使用构造函数? [复制]
【发布时间】:2021-04-07 06:59:04
【问题描述】:

OOP 让我很头疼 :( 因为我了解构造函数的工作原理,但我不明白它们的用途。

我有一个名为Player 的类,如下所示:

class Player
{
private:
    std::string name;
    int health;
    int xp;
public:
    //Overloaded Constructor
    Player(std::string n, int h, int x) 
        {
        name = n;
        health = h;
        xp = x;
        }       
};

int main()
{
    Player slayer("Jimmy", 1000, 200);
    return 0;
}

在那里使用构造函数(我不知道它的作用或用途)我可以使用 set_nameget_name 方法来设置名称 - 并对 health 和 xp 执行相同的操作 -然后使用函数获取名称。所以,构造函数代替了函数???

如果它不替换 set & get 那么它的目的是什么?此外,我可以使用上面相同的构造函数来初始化我的属性并避免垃圾:

Player(std::string n, int h, int x) : name{n}, health{h}, xp{x} {}

但是我也可以这样做:

Player(std::string n, int h, int x) : name{n}, health{h}, xp{x} { name = n; health = h; xp = x;}

我不明白,这是什么意思?我知道在第一种情况下我正在初始化它,在第二种情况下我说名称 health 和 xp 等于我要设置的任何值。

知道了所有这些信息,我仍然不知道什么是构造函数以及我应该将它用于什么。这很混乱。

【问题讨论】:

  • 构造函数不会替换 setter。它只允许您指定对象的初始状态。如果你的类型被默认构造是有意义的,那么你可以省略构造函数。但这并不适用于所有类型。
  • 仅仅因为这个特定的类并不严格需要构造函数,这并不意味着 C++ 中的任何类都不需要构造函数。尝试使用没有显式构造函数的引用或const 成员编写一个类,看看对你来说效果如何。
  • 你的最后一个 sn-p 根本没有意义,因为你正在初始化变量两次。优先使用成员初始化列表的构造,因为它易于优化,并且在 C++11 之前是不允许的
  • @LuigiIstratescu 使用它们的目的取决于您。通常它们用于初始化必须初始化的东西。如果您的namehealthxp 不必初始化,那么您可以不初始化它们。随着您获得更多编程经验,您可能会发现初始化这些东西很有帮助,或者您可能不会。
  • @LuigiIstratescu 是的,构造函数的目的是设置对象的初始状态。当创建对象的新实例时运行构造,然后不再为该实例执行构造函数。请注意,您还可以编写构造函数,使它们除了纯粹初始化对象之外还可以产生副作用,但构造函数的目的仍然是在构造类型的新实例时起作用。

标签: c++ function constructor destructor class-constructors


【解决方案1】:

构造函数在 C++ 中起着非常重要的作用。使用正确编写的构造函数,您知道对象始终有效。它永远无法分配,但不知何故处于无效状态。

通常,如果您的类有一个设置其所有状态的set 方法,您只需让构造函数使用一组适当的默认值执行set。这样您就不需要复制代码,并且您的对象具有从一开始就处于有效状态的良好属性。

【讨论】:

  • 我认为与这个提问者交谈的抽象级别是错误的。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 2012-10-03
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
相关资源
最近更新 更多