Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533

Перегрузка оператора '=' в классе

05.11.2014, 10:34. Показов 1397. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cstring>
 
using std::cout;
using std::endl;
 
class CMessage
{
  public:
        CMessage(const char* txt = "")
        {
            this->pmess = new char[strlen(txt) + 1];
            strcpy(this->pmess, txt);
        }
        CMessage& operator=(const CMessage &obj)
        {
            if(this == &obj)
                return *this;
            
            delete [] this->pmess;
            pmess = new char[strlen(obj.pmess) + 1];
            strcpy(this->pmess, obj.pmess);
            return *this;
        }
        char* pmess; 
};
 
int main(void)
{
    CMessage tx1;
    tx1 = "test"; // почему строка передается объекту, ведь перегруженный оператор "=" принимает const CMessage &obj, т.е ссылочный объект класса..
    cout << tx1.pmess << endl;
    return 0;
}
Собственно вопрос комментирован в строке 31. Не понятно как в ссылочный класс типа CMessage передается тип char*. Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.11.2014, 10:34
Ответы с готовыми решениями:

Перегрузка оператора [] в классе
У меня есть класс Array(одномерный массив), и стоит задача перегрузка оператора. Реализовать для объектов данного класса перегрузку...

Перегрузка оператора присваивания в классе
Напишите пожалуйста простой пример перегрузки оператора присваивания в классе и пояснение зачем это надо

Перегрузка оператора ==, в классе Матрица
#ifndef MATRIX_H #define MATRIX_H template &lt;class T&gt; class Matrix { public: Matrix(int Rows, int Cols); ~Matrix(); ...

6
16 / 16 / 6
Регистрация: 03.11.2014
Сообщений: 72
05.11.2014, 10:47
А Вы отладчиком пользовались?видели как попадаете в свой перегруженный оператор?
0
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
05.11.2014, 11:04  [ТС]
Cookie Monster, сначала строчка "test" попадает в конструктор объекта CMessage (строка 10), (почему он туда залетел??). Создается объект CMessage, потом залетает в r-значение перегруженного оператора "=" (строчка 15) . Все равно не очень понятно, ведь там ссылочный объект. По моей логике программа должна вываливаться в ошибку, ведь "строка" != CMessage&... что то я запутался..
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.11.2014, 11:08
Лучший ответ Сообщение было отмечено worldown как решение

Решение

Цитата Сообщение от worldown Посмотреть сообщение
Cookie Monster, сначала строчка "test" попадает в конструктор объекта CMessage (строка 10), (почему он туда залетел??).
Потому что конструктор выполняет функцию, обратную оператору приведения, то есть приводит не свой класс к другому типу, а другой тип к своему классу, но всё таки приводит тип. А что надо сделать, если оператор просит операнд некоторого типа, а на вход подано что то левое? Правильно, привести тип.
1
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
05.11.2014, 11:12  [ТС]
taras atavin, Понял спасибо =)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
05.11.2014, 11:17
Конструктор 'CMessage(const char*)' является т.наз. конструктором конверсии. Он будет неявно вызываться компилятором всякий раз, когда ему нужно привести тип 'const char *' к типу 'CMessage'.

При желании вы можете объявить этот конструктор как explicit

C++
1
explicit CMessage(const char* txt = "")
и компилятор перестанет использовать его неявно. Код

C++
1
2
CMessage tx1;
tx1 = "test";
перестанет компилироваться. При этом вы сохраните возможность выполнять конверсию явно

C++
1
2
CMessage tx1;
tx1 = CMessage("test");
1
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
05.11.2014, 12:07  [ТС]
TheCalligrapher, Больше всего мне не был понятен аргумента ссылочного типа CMessage (CMessage& operator = (const CMessage &obj)...), другое дело если бы был просто объект то тут как бы все более менее ясно (текст -> конструктор -> объект -> аргумент), оказывается в С++ этот момент продуман, даже в отношении ссылочного типа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.11.2014, 12:07
Помогаю со студенческими работами здесь

Перегрузка оператора в шаблонном классе
Здравствуйте! Есть шаблонный класс Array, описывающий массив. Такая проблема: нужно перегрузить оператор &quot;&lt;&quot;, который...

Перегрузка оператора + в классе матрица
Есть перегрузка оператора = Matrix&amp; operator = (const Matrix &amp;object) { if (array != nullptr) { for (int i = 0; i &lt;...

Перегрузка бинарного оператора << в template классе
Помогите пожалйста люди! не получается перегрузить оператор &gt;&gt; и &lt;&lt; в шаблонном классе выдает ошибку: error C2804: бинарный 'operator...

Перегрузка оператора для структуры в классе
Ошибка overloaded 'operator==' must be a binary operator (has 3 parameters) строка 108. Как правильно написать перегрузку оператора в моем...

Перегрузка дружественного оператора вывода в шаблонном классе
Здравствуйте! Я не могу понять как мне правильно сделать перегрузку оператора вывода ввывода в шаблонном классе ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru