【发布时间】: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_name 和 get_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 使用它们的目的取决于您。通常它们用于初始化必须初始化的东西。如果您的
name、health和xp不必初始化,那么您可以不初始化它们。随着您获得更多编程经验,您可能会发现初始化这些东西很有帮助,或者您可能不会。 -
@LuigiIstratescu 是的,构造函数的目的是设置对象的初始状态。当创建对象的新实例时运行构造,然后不再为该实例执行构造函数。请注意,您还可以编写构造函数,使它们除了纯粹初始化对象之外还可以产生副作用,但构造函数的目的仍然是在构造类型的新实例时起作用。
标签: c++ function constructor destructor class-constructors