const字符串成员出错:没有合适的默认构造函数可用

时间:2014-02-06 05:05:25

标签: c++ constructor

我在以下简单代码中遇到no appropriate default constructor available错误:

    class A
{
    public:
        const string cs ;

};

void main()
{
    A a;
    return;
}

如果我从字符串中删除const,那么代码编译正常。我无法理解为什么编译器不会创建default constructor?和const string成员变量有什么关系? 我正在研究VS2008。

2 个答案:

答案 0 :(得分:0)

正如评论中所提到的,const变量不能在C ++中保持单元化。有两种方法可以初始化变量。在这两种情况下,都不能修改字符串的内容(因为这是const的意思)。

一:在班级宣言中。仅当您始终希望此字符串在所有对象中具有相同值时,此方法才有用。它非常不灵活,如果您发现自己使用它,您应该将变量声明为static

class A
{
    const string cs = "value of cs";
};

或者,使用const成员初始化的特殊语法在构造函数中指定它。这更加灵活和惯用。

class A
{
     const string cs;

 public:

     A() : cs("value of cs") 
     {

     }

 };

请注意,这可以与参数一起使用,例如

A(string s) : cs(s) //initializes cs to the value of s

您的错误可能是因为编译器试图找到第二个选项。

答案 1 :(得分:0)

自C ++ 17起,拥有const成员且不带有初始化程序是合法的-如果该成员具有用于初始化自身的默认构造函数。 void main()仍然不正确!

这是一些有效的代码:

#include <string>

struct A { const std::string cs; };

int main()
{
     A a;
}

字符串a.cs是一个空字符串,const

如果使用较旧的编译器,则必须为cs提供冗余的初始化程序。