具有Const成员的构造函数的语法

时间:2014-02-05 17:09:39

标签: c++ const

我有一段时间没有做过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;
}

世界上一切都很好。但是,当我将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);
}

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

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

所以我想我正在努力弄清楚这是什么样的语法 ... titleminutes应该是const ,但DVD的构造函数参数列表只需const string。我无法弄清楚我错过了什么 - 自从我上次用C ++编写以来已经有一段时间了。

2 个答案:

答案 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)
{}