Допустим, есть такой код:
class String
{
private:
enum {SZ = 80};
char str[SZ];
public:
String()
{ strcpy(str, ""); }
String(char s[])
{ strcpy(str, s); }
void display() const
{ cout << str; }
void operator+=(String ss)
{
if (strlen(str) + strlen(ss.str) < SZ)
strcat(str, ss.str);
else
cout << "Overflow!" << endl; exit(1);
}
};
int main()
{
String s1("str1 ");
String s2("str2");
}
На 2 операции в main компилятор жалуется, мол, нельзя преобразовать const char[10] в String. Но почему, если есть соответствующий для этого конструктор?
Нет такого конструктора. Есть конструктор для char*, а не для const char*.
Замените
String(char s[])
на
String(const char s[])
C++ запрещает присваивание указателя на const указателю на не const. Если бы такое было разрешено, то можно было бы менять константные обьекты.
Потому что вы обещаете изменять в конструкторе передаваемую строку. А изменять литерал нельзя...
String(const char * s)
вас спасет. Понимаете, const в C++ применяют не только, и не столько потому, что это загадочно звучит и красиво смотрится... :)
Сборка персонального компьютера от Artline: умный выбор для современных пользователей