【发布时间】: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 个私有成员变量,string 是const。构造函数还接受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);
}
所以,现在minutes 是const,我得到以下编译错误:
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
所以我想我正在努力弄清楚 该死的语法是什么...title 和 minutes 应该是 const,但构造函数的参数列表对于DVD,只需要一个const string。我不知道我错过了什么 - 自从我上次用 C++ 编码已经有一段时间了。
【问题讨论】:
-
习惯于成员初始化 X : member(value) {]
-
语法总是一样的:如果你想以某种特定的方式初始化数据成员,你可以在构造函数初始化列表中进行(虽然你也可以在C++11 中的声明点)。发生的情况是您无法分配或修改
const数据成员。 -
@Csq 你可能是对的——就像我说的,自从我上次做 C++ 以来已经很久了。我完全忘记了初始化列表。有趣的是,我查看了 WhozCraig 链接的问题(在我发布此问题之前),我阅读时并没有真正理解它。无论如何,我现在明白了,所以谢谢你的 cmets :)