带有const成员的构造函数的语法

Syntax on Constructors with Const Members

本文关键字:构造函数 语法 成员 const 带有      更新时间:2023-10-16

我一段时间没有完成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

所以我想我正在努力弄清楚 darn语法是什么... titleminutes应该是 const,但是 DVD的构造函数的参数列表仅为 const string。我无法弄清楚我缺少什么 - 自上次在C 中编码以来已经有一段时间了。

const string title = t;

声明局部变量。在世界上一切都不好:您没有将成员变量设置为所需的价值。要初始化成员,请使用构造函数的启动器列表:

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

您的版本尝试 default-initialise initialiser列表中未提及它们),然后 sigtion 。这对无法默认限制的成员(例如,参考文献或没有默认构造函数的类类型)或分配给(例如const成员)。

您可以初始化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)
{}