Daniro_San
@Daniro_San
Программист

Почему не получается полностью перегрузить оператор =?

Вот код.
#include<iostream>
class MyExpirementalString
{
public:
    void operator=(const char *const cstr)
    {
        /// Проверяем работу перегруженного оператора =
        std::cout<<cstr<<std::endl;
    }
};
int main()
{
    std::string str0="Hello"; /// Все нормально

    MyExpirementalString str="Hello"; /// Ошибка. Почему?

    /// Тогда как
    str="Hello"; /// Работает нормально
}

Почему не получается перегрузить оператор = что бы он работал сразу при создании переменной?
MyExpirementalString s="str";

Обновление:
Исправил класс так:

#include<iostream>
class MyExpirementalString
{
public:
     MyExpirementalString(const char *const cstr)
    {
        std::cout<<cstr<<std::endl;
    }
};
int main()
{
    std::string str0="Hello"; /// Все нормально

    MyExpirementalString str="Hello"; /// Все нормально
}

Но что тут происходит? Плюсы взрывают мозг
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
@MiiNiPaa
Ошибка. Почему?
Потому что вы не вызываете оператор присваивания, а совершаете copy-initializtion. Вам может помочь простое правило: все действия совершаемые при объявлении переменной вызывают конструктор.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@res2001
Developer, ex-admin
В первом случае с ошибкой - у оператора присваивания другая сигнатура - там должна быть ссылка. В вашем случае как-то так:
void operator=(const char *& cstr)
Компилятор не находит подходящего оператора присваивания, отсюда ошибка.
Во втором случае - вы сделали подходящий конструктор и компилятор им воспользовался. Но лучше этот конструктор определить как конструктор копирования:
MyExpirementalString(const char *& cstr)
Ответ написан
Комментировать
Конструктор с одним параметром желательно объявить explicit.
Ответ написан
Комментировать
@014
Напиши явно конструктор копирования:
MyExpirementalString(MyExpirementalString & cstr)
    {
        std::cout<<cstr<<std::endl;
    }


и конструктор с указателем на char у тебя уже не будет пахать. У меня так, и нихера не понятно почему.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы