为什么不是我的类构造函数初始化其成员变量?

为什么不是我的类构造函数初始化其成员变量?

问题描述:

如果信息有点欠缺,请原谅我,因为我试图按照建议的“提问指南”进行操作。为什么不是我的类构造函数初始化其成员变量?

我创建了一个名为“项”来存储项目信息类如下定义我的构造函数:

Item::Item(std::string number, std::string name, int quantity, double price) { 
    itemNumber = number; 
    itemName = name; 
    quantity = quantity; 
    unitPrice = price; 
} 

,我初始化它在我的主要功能如下所示:

Item temp("string", "string", 0, 0); 

但是当我打印项目的值时,只有itemNumber和itemName打印正确。所打印的是随机垃圾。然后我意识到问题是数量和价格没有得到初始化。这是为什么?

+1

请发布[MCVE](http://*.com/help/mcve) – 2014-10-08 17:35:50

+2

您应该使用唯一的变量名称。这也是各种样式指南为成员变量的变量提供“m_”前缀的原因之一,例如, 'm_quantity =数量' – CoryKramer 2014-10-08 17:40:54

+0

哦,哇,那差不多了。我不能相信我错过了这一点。谢谢! – Eddie 2014-10-08 17:45:24

尝试

this->quantity = quantity; 

或(恕我直言更好):

Item::Item(const std::string& number, const std::string& name, int quantity_, double price) { 
                  //^
    // ... 
    quantity = quantity_; 
    // ... 
} 

或(恕我直言更好)使用构造函数初始化列表:

Item::Item(const std::string& number, const std::string name&, int quantity, double price) 
: itemNumber(number), itemName(name), quantity(quantity), unitPrice(price) {} 

“这是为什么那?”

参数名称当前会在构造函数的主体范围中隐藏您的成员变量名称。


我个人倾向于有类的声明如下喜欢

class Item { 
public: 
    Item(const std::string& number, const std::string& name, int quantity, double price) 
    : itemNumber_(number) 
    , itemName_(name) 
    , quantity_(quantity) 
    , unitPrice_(price) {} 
private: 
    std::string itemNumber_; 
    std::string itemName_; 
    int quantity_; 
    double unitPrice_ 
}; 
+1

为什么给一个参数加上'_',而不是另一个,这是不一致的。 – 2014-10-08 17:43:15

+0

@NeilKirk好吧,其他人不会隐藏任何成员变量名称。会比澄清恕我直言混淆更多。 – 2014-10-08 17:44:32

+0

为什么不给班级成员提供'_'后缀而不是像你在问题评论中说的那样的参数?我相信这会使它更加一致,不那么令人困惑。 – Kaiged 2014-10-08 19:41:46

quantity = quantity;两者这里指的是参数,而不是成员变量。 要引用的成员变量,其具有相同的名称的参数的函数的内部,则必须使用该指针,例如this->quantity = quantity;或者可替换地与类名例如限定它Item::quantity = quantity;

另外也可以使用初始化列表,以避免此问题并可能更有效地初始化您的课程。

Item::Item(const std::string& number, const std::string& name, int quantity, double price) 
: itemNumber(number) 
, itemName(name) 
, quantity(quantity) 
, price(price) 
{ 
} 

我冒昧地让你的字符串参数const引用以避免副本。

+0

但是你正在做'itemNumber(number),itemName(name)'的副本。您只是将副本转移到其他地方,并且使编译器难以优化。 – 2014-10-08 20:01:56

+0

@MattMcNabb也许在C++ 11中,我不确定,但不是旧的C++。任何涉及带堆分配的字符串的微优化都可以忽略不计。 Const引用永远不会让我失望。 Const的参考文章让我感觉很好 – 2014-10-08 20:34:40