Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量字符串成员出错:没有合适的默认构造函数可用_C++_Constructor - Fatal编程技术网

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

C++ 常量字符串成员出错:没有合适的默认构造函数可用,c++,constructor,C++,Constructor,我得到的没有合适的默认构造函数可用错误代码如下: class A { public: const string cs ; }; void main() { A a; return; } 如果我从字符串中删除常量,那么代码就可以正常编译。我不明白为什么编译器没有创建默认构造函数?而常量字符串成员变量的处理是什么? 我在VS2008工作。 < P>如注释中所提到的, const >变量不能在C++中被单独化。有两种方法可以初始化变量。在这两种情

我得到的
没有合适的默认构造函数可用
错误代码如下:

    class A
{
    public:
        const string cs ;

};

void main()
{
    A a;
    return;
}
如果我从字符串中删除
常量
,那么代码就可以正常编译。我不明白为什么编译器没有创建
默认构造函数
?而
常量字符串
成员变量的处理是什么?
我在VS2008工作。

< P>如注释中所提到的,<代码> const <代码> >变量不能在C++中被单独化。有两种方法可以初始化变量。在这两种情况下,都不能修改字符串的内容(因为这是
const
的意思)

1) 在类声明中。只有始终希望此字符串在所有对象中具有相同的值时,此方法才有用。它非常不灵活,如果您发现自己正在使用它,您可能应该将变量声明为
static

class A
{
    const string cs = "value of cs";
};
2) 使用构造函数链接在构造函数中分配它。这是更灵活和惯用的

class A
{
     const string cs;

 public:

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

     }

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

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

您的错误可能是由于编译器试图找到第二个选项而引起的。

由于C++17,如果一个
const
成员有一个自己初始化的默认构造函数,则该成员不带初始化器是合法的<代码>void main()仍然不正确

下面是一些有效的代码:

#include <string>

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

int main()
{
     A a;
}
#包括
结构A{const std::string cs;};
int main()
{
A A;
}
字符串
a.cs
是一个空字符串,它是
const


如果使用较旧的编译器,则必须为
cs

const
变量提供一个冗余的初始值设定项。和<>代码> main < /COD>不是C++。使用
intmain
。这听起来可能是一个愚蠢的问题,但您是否使用了
#包括
名称空间std
?@BrianBi这样判断:“如果我从字符串中删除“const”,那么代码就可以编译了。”我同意是的,他已经涵盖了这一点。@chris,像这样声明
const
变量没有什么错。它只使用默认构造函数。您需要在c++中初始化常量变量。谢谢您的回答。正如我在上面的一条评论中提到的,如果我为类A提供并清空默认的ctor,它没有初始化常量字符串的初始化列表,那么它也可以编译。如果空的默认ctor有效,那么为什么编译器生成的默认ctor在这种情况下不起作用呢?并非所有情况都是这样。如果该类型未提供默认构造,则为true,否则为true。如果显示OP的代码出现此问题,则没有理由。类
std::string
具有默认构造函数。在OP的例子中,结果是一个毫无意义的空字符串,但除了理智之外,这并没有任何问题。@WhozCraig感谢您提供的链接“查看实况”。我认为这是一个C++ 11已经克服的错误。我可以看出它在C++ 11中没有显示编译错误。@ WooCurig我假设问题是在<>代码> A/COD>默认构造函数,而不是<代码> STD::String < /Cord>。