为什么带有const关键字的构造函数可以工作而没有它呢?

时间:2018-04-10 21:10:54

标签: c++ constructor const

在这个例子中,根据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(这是故意的还是在他写这本书的时候还可以吗?)?

2 个答案:

答案 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关键字。