为什么不是我的类构造函数初始化其成员变量?
如果信息有点欠缺,请原谅我,因为我试图按照建议的“提问指南”进行操作。为什么不是我的类构造函数初始化其成员变量?
我创建了一个名为“项”来存储项目信息类如下定义我的构造函数:
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打印正确。所打印的是随机垃圾。然后我意识到问题是数量和价格没有得到初始化。这是为什么?
尝试
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_
};
为什么给一个参数加上'_',而不是另一个,这是不一致的。 – 2014-10-08 17:43:15
@NeilKirk好吧,其他人不会隐藏任何成员变量名称。会比澄清恕我直言混淆更多。 – 2014-10-08 17:44:32
为什么不给班级成员提供'_'后缀而不是像你在问题评论中说的那样的参数?我相信这会使它更加一致,不那么令人困惑。 – 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引用以避免副本。
但是你正在做'itemNumber(number),itemName(name)'的副本。您只是将副本转移到其他地方,并且使编译器难以优化。 – 2014-10-08 20:01:56
@MattMcNabb也许在C++ 11中,我不确定,但不是旧的C++。任何涉及带堆分配的字符串的微优化都可以忽略不计。 Const引用永远不会让我失望。 Const的参考文章让我感觉很好 – 2014-10-08 20:34:40
请发布[MCVE](http://stackoverflow.com/help/mcve) – 2014-10-08 17:35:50
您应该使用唯一的变量名称。这也是各种样式指南为成员变量的变量提供“m_”前缀的原因之一,例如, 'm_quantity =数量' – CoryKramer 2014-10-08 17:40:54
哦,哇,那差不多了。我不能相信我错过了这一点。谢谢! – Eddie 2014-10-08 17:45:24