0

在试图找出构造函数时,我有一个巨大的脱节。我的问题是:具有初始化列表的构造函数是否替换了类的 set 方法?例如:

Class Rock
{
private: 
    double Weight;
public:
    void setWeight(double)
    { Weight = wei; }
    double getWeight()
    { return Weight; }
    double calcWeight()
    { return Weight *= 2; } 
}

是否会使用带有初始化列表的构造函数,类似于:Rock::Rock(double): Weight(w) {}使用 set 方法替换?

4

2 回答 2

1

构造函数和所谓的setter方法是两个不同的东西,并且在不同的上下文中使用。与 setter 不同,构造函数可以隐式使用(例如,当我们有一个带有类类型元素的标准库容器时使用默认构造函数),当一个对象被实例化时

std::vector<Rock> vec_of_rocks; // Will contain default initialized Rock objects

此外,构造函数允许我们控制当我们复制构造对象时(如在 中Rock b(a);)以及在其他少数情况下如何实例化它。

同时,该类的用户可以使用 setter 方法显式地修改现有对象。大多数情况下, setter方法用于提供安全且受控的方式来修改某些private数据成员。

// First check for the weight to be non-negative, then set it
void Rock::setWeight(const double &d)
    { if (d >= 0) Weight = d; else Weight = 0; } 

Rock r_object; // Default initialized object r_object (by default constructor) 
r_object.setWeight(3.14); // In the user-code, we modify default initialized value

请注意,我们可以通过构造函数成员初始化器列表引入使用指定值初始化对象的构造函数。

Rock::Rock(const double &d) : Weight(d) {} // Constructor that takes an argument, not a default one
Rock r_object_2(1,12); // Uses the defined above constructor, not a default one
于 2021-06-01T04:35:44.777 回答
0

设置器和构造器用于完全不同的目的,一个永远不会“替换”另一个。

构造器设置实例的初始状态,而设置器允许您在构造后更改该状态。

话虽这么说,如果您发现自己在执行以下操作:

Rock rock;
rock.setWeight(3);

然后你实际上在做的是设置岩石的初始状态。在这种情况下,是的,将权重作为参数的构造函数是更可取的。

但是,请注意,这是在使用类时发生的区别,而不是在声明它时。

于 2021-06-01T04:32:32.063 回答