我在以下简单代码中遇到no appropriate default constructor available
错误:
class A
{
public:
const string cs ;
};
void main()
{
A a;
return;
}
如果我从字符串中删除const
,那么代码编译正常。我无法理解为什么编译器不会创建default constructor
?和const string
成员变量有什么关系?
我正在研究VS2008。
答案 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
提供冗余的初始化程序。