Почему конструктор с ключевым словом const будет работать, а без него — нет?

В этом примере из книги Роберта Лафора 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";
}

Почему я должен использовать константу и почему автор пропустил эту константу (это сделано намеренно или к тому времени, когда он писал эту книгу, это было нормально?)?


person Çağan Kuyucu    schedule 10.04.2018    source источник
comment
Пожалуйста, купите себе лучшую книгу. Если вы используете тот, который я нашел на amazon, он был опубликован в 1996 году, еще до того, как C++ был стандартизирован, и задолго до современного C++.   -  person NathanOliver    schedule 11.04.2018
comment
Моя книга вышла примерно в 2006-2009 годах.   -  person Çağan Kuyucu    schedule 11.04.2018
comment
также выдает какую-то ошибку, не очень полезная вещь для отчета   -  person pm100    schedule 11.04.2018
comment
Как называется книга?   -  person NathanOliver    schedule 11.04.2018
comment
Объектно-ориентированное программирование на C++ (4-е издание).   -  person Çağan Kuyucu    schedule 11.04.2018
comment
Я предполагаю, что вы используете MS strcpy_s()? Хотя в необязательном и ненавистном приложении k стандарта C есть еще один аргумент, в стандарте C++ его нет. Кроме того, имейте в виду, что using namespace std; выходит за рамки дурного тона, и может быть потенциально оправдано только тем, что автору приходится угождать редактору по размеру, чтобы вообще быть опубликованным.   -  person Deduplicator    schedule 11.04.2018
comment
Я бы по-прежнему рекомендовал одну из книг по ссылке в моем первом комментарии. Похоже, ваша книга была опубликована в 2001 году. Эта книга не похожа на то, что она научит вас стандартному С++, и больше похожа на книгу C с классами (а это не то, что C++)   -  person NathanOliver    schedule 11.04.2018
comment
@NathanOliver Спасибо за совет, я подумаю о покупке нового.   -  person Çağan Kuyucu    schedule 11.04.2018


Ответы (2)


Это потому, что "hey", которое вы передаете в свой конструктор, является const char *, и вы не можете передать значение const функции, объявленной для приема параметра, отличного от const.

person Paul Evans    schedule 10.04.2018

Когда вы инициализируете строку следующей строкой, вы фактически предоставляете ей const char *.

String s1 = "hey";

Однако, если у вас нет конструктора, который принимает const char * в качестве параметра, у вас в основном нет конструктора для создания объекта. Потому что const char * нельзя автоматически преобразовать в char *. Если бы это можно было сделать, то вообще не было бы смысла использовать ключевое слово const.

Итак, если у вас должен быть конструктор String, который принимает в качестве параметра char *, вам следует рассмотреть возможность копирования символов в «hey» в массив символов A, а затем передать A в конструктор.

В качестве альтернативы просто сохраните ключевое слово const.

person ilim    schedule 10.04.2018