在这个例子中,根据Robert Lafore的C ++书籍,作者如何使用const关键字,尝试在Visual Studio 2017中执行相同的代码会产生下面列出的错误。我不确定作者是否在这里犯了错误。最终,添加一个const关键字已经为我解决了这个问题。
以下是错误,以防他们提供帮助: 1- E0415没有合适的构造函数可以从“const char [5]”转换为“String”
2-'初始化':无法从'const char [5]'转换为'String'
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class String {
/*
.
.
.
*/
String(const char s[]) { //Please note that actually there is no const keyword in the book. I've just put it in there.
strcpy_s(str, s);
}
/*
.
.
.
*/
};
int main() {
String s1 = "hey";
}
为什么我必须使用const,为什么作者省略了const(这是故意的还是在他写这本书的时候还可以吗?)?
答案 0 :(得分:2)
那是因为您传递给构造函数的"hey"
是const char *
而您无法将const
值传递给声明为非const
的函数参数。
答案 1 :(得分:2)
使用以下行初始化字符串时,实际上会为其提供const char *
。
String s1 = "hey";
但是,除非你有一个以const char *
为参数的构造函数,否则你基本上没有用于构建对象的构造函数。因为const char *
无法自动转换为char *
。如果可以做到这一点,那么根本就没有const
关键字。
因此,如果你必须有一个String构造函数作为参数char *
,那么你应该考虑将“hey”中的字符复制到一个char数组A
,然后传递A
进入构造函数。
或者,只需保留const
关键字。