【问题标题】:Why does a constructor with a const keyword will work while it won't without it?为什么带有 const 关键字的构造函数可以工作,而没有它就不行?
【发布时间】:2018-04-10 21:10:54
【问题描述】:

在此示例中,来自 Robert Lafore 的 C++ 书籍,但作者没有使用 const 关键字,但尝试在 Visual Studio 2017 中执行相同的代码会出现下面列出的错误。我不确定作者是否在这里犯了错误。最终,添加一个 const 关键字为我解决了这个问题。

如果有帮助,请查看以下错误: 1- E0415 不存在合适的构造函数来将“const char [5]”转换为“String”

2- 'initializing': 无法从 '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(这是故意的还是在他写这本书的时候还可以?)?

【问题讨论】:

  • 请给自己一个更好的book。如果您使用的是我在亚马逊上找到的那个,它是在 1996 年发布的,当时 C++ 甚至还没有标准化,而且比“现代”C++ 早得多。
  • 我的书出版于 2006-2009 年左右。
  • “给出一些错误”也不是很有帮助的报告
  • 书名是什么?
  • C++ 中的面向对象编程(第 4 版)。

标签: c++ constructor constants


【解决方案1】:

因为您传递给构造函数的"hey"const char *,并且您不能将const 值传递给声明为采用非const 参数的函数。

【讨论】:

    【解决方案2】:

    当你用下面这行初始化一个字符串时,你实际上是给它一个const char *

    String s1 = "hey";
    

    但是,除非您有一个以const char * 作为参数的构造函数,否则您基本上没有构造函数可以用来构建对象。因为,const char * 不能自动转换为 char *。如果可以做到这一点,那么使用 const 关键字就没有任何意义了。

    因此,如果您必须有一个将char * 作为参数的String 构造函数,那么您应该考虑将“hey”中的字符复制到char 数组A,然后将A 传递给构造函数。

    或者,只需保留 const 关键字。

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2019-05-17
      • 1970-01-01
      • 2018-04-07
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多