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>。