【问题标题】:Syntax on Constructors with Const Members [duplicate]具有 const 成员的构造函数的语法 [重复]
【发布时间】:2014-02-05 17:09:39
【问题描述】:

我已经有一段时间没有做 C++ 编码了,我的朋友在做作业时遇到了麻烦。我从来没有真正使用过const,这让这成为一场噩梦,因为我无法弄清楚构造函数的正确语法。想象一下,我在dvd.h 中有这个:

class DVD {
    const string title;
    int minutes;
    double price;

  public:
    DVD(const string t, int m, double p);
}

3 个私有成员变量,stringconst。构造函数还接受const string

所以现在,在dvd.cpp 我可以执行以下操作:

#include "dvd.h"

DVD::DVD(const string t, int m, double p) {
    const string title = t;
    minutes = m;
    price = p;
}

世界上一切都很好。但是,当我将dvd.h 中的minutes 修改为const(这是他的教授构造文件的方式)时,我们在dvd.h 中有这个:

class DVD {
    const string title;
    const int minutes; // Here is the change
    double price;

  public:
    DVD(const string t, int m, double p);
}

所以,现在minutesconst,我得到以下编译错误:

assignment of read-only member 'DVD::minutes'   dvd.cpp
uninitialized member 'DVD::minutes' with 'const' type 'const int' [-fpermissive]    dvd.cpp

我认为这是有道理的,因为我试图将一个值设置const 变量中。于是我尝试对dvd.cpp 中的const string title 做同样的事情来解决错误:

DVD::DVD(const string t, int m, double p) {
    const string title = t;
    const int minutes = m; // Was 'minutes = m;'
    price = p;
}

并得到以下 (1) 个错误和 (1) 个警告:

uninitialized member 'DVD::minutes' with 'const' type 'const int' [-fpermissive]    dvd.cpp
unused variable 'minutes' [-Wunused-variable]   dvd.cpp

所以我想我正在努力弄清楚 该死的语法是什么...titleminutes 应该是 const,但构造函数的参数列表对于DVD,只需要一个const string。我不知道我错过了什么 - 自从我上次用 C++ 编码已经有一段时间了。

【问题讨论】:

  • 习惯于成员初始化 X : member(value) {]
  • 语法总是一样的:如果你想以某种特定的方式初始化数据成员,你可以在构造函数初始化列表中进行(虽然你也可以在C++11 中的声明点)。发生的情况是您无法分配或修改const数据成员。
  • @Csq 你可能是对的——就像我说的,自从我上次做 C++ 以来已经很久了。我完全忘记了初始化列表。有趣的是,我查看了 WhozCraig 链接的问题(在我发布此问题之前),我阅读时并没有真正理解它。无论如何,我现在明白了,所以谢谢你的 cmets :)

标签: c++ constants


【解决方案1】:
const string title = t;

声明一个局部变量。世界上一切都不好:你没有将成员变量设置为你想要的值。要初始化成员,请使用构造函数的初始化列表:

DVD::DVD(const string t, int m, double p) :
    title(t), minutes(m), price(p)
{}

您的版本尝试默认初始化每个成员(因为初始化列表中没有提到它们),然后分配每个成员。这不适用于无法默认初始化的成员(例如引用,或没有默认构造函数的类类型)或分配给(例如const 成员)。

【讨论】:

  • 感谢您澄清这一点 - 我尝试做的是构造函数以我通常使用的语言工作的通常方式,但我不记得它到底是怎么回事用 C++ 完成。谢谢:)
【解决方案2】:

您可以像这样初始化const 和非const 成员:

DVD::DVD(const string t, int m, double p)
    : title(t)
    , minutes(m)
    , price(p)
{}

请注意,如果您使用 C++98/03,您可能希望将 string 参数作为 const& 传递(以避免对字符串复制构造函数的无用和低效调用):

DVD(const string& t, ...other stuff...)
    ... same init as above

如果你使用的是C++11(实现了移动语义),你可以通过值传递字符串参数,并从值传递std::move()

DVD::DVD(string t, int m, double p)
    : title(std::move(t)),
    , minutes(m)
    , price(p)
{}

【讨论】:

    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 2012-08-15
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2012-03-02
    相关资源
    最近更新 更多