Защо конструктор с ключова дума const ще работи, докато без нея не?

В този пример, от книгата C++ на Robert Lafore, авторът не е използвал ключова дума 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 с класове (което не е това, което е 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 конструктор, който приема като параметър a char *, тогава трябва да обмислите копирането на знаците в "hey" в char array A и след това да прехвърлите A в конструктора.

Като алтернатива просто запазете ключовата дума const.

person ilim    schedule 10.04.2018