我有一段时间没有做过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;
}
世界上一切都很好。但是,当我将minutes
中的dvd.h
修改为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
变量。那么我尝试使用const string title
中的dvd.cpp
做同样的事情来解决错误:
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 ++编写以来已经有一段时间了。
答案 0 :(得分:8)
const string title = t;
声明一个局部变量。一切都与世界不符:你没有将成员变量设置为你想要的值。要初始化成员,请使用构造函数的初始化列表:
DVD::DVD(const string t, int m, double p) :
title(t), minutes(m), price(p)
{}
您的版本尝试默认初始化每个成员(因为初始化列表中未提及它们),然后分配每个成员。这对于无法初始化的成员(例如引用或没有默认构造函数的类类型)或分配给(例如const
成员)的成员不起作用。
答案 1 :(得分:3)
您可以像这样初始化您的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)
{}