Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/35: Рейтинг темы: голосов - 35, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 40

Оператор присваивания.

10.01.2012, 21:55. Показов 6799. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!В универе щас работаем с классами и перегрузками.В частности перегрузкой оператора присваивания и индексации.И я в упор не понимаю зачем это нужно.Например:
1)Оператор присваивания:
C++
1
2
3
4
5
6
class String {
String& operator = (String& s);        // перегрузка оператора присваивания
}
 
cout<<"\nОператор присваивания c=a\t";    
    String c=a;                                       // Само присваивание
Я не понимаю,зачем мы перегружаем оператор?Как он начинает ввести себя на программном уровне?Ведь обычный конструктор копирования передает побитово?Преподователь спрашивает,зачем мы используем ссылку во время перегрузки?Что будет если ее убрать?


2)Тоже самое про индексацию.Помогите пожалуйста всю голову сломал.Большое спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2012, 21:55
Ответы с готовыми решениями:

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

оператор присваивания
Подскажите пожалуйста, вот я создал класс, конструктор которого создает 2хмерный массив из 2ойного указателя, являющейся членом этого...

Оператор присваивания
Какая разница между оператором &quot;=&quot; и &quot;==&quot; Почему , например , в цикле нужно писать while(count==1) а не ...

8
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
10.01.2012, 22:21
Класс использует динамическую память для хранения строки символов, непосредственно в нём хранится только адрес и технические переменные. Если использовать конструктор копирования по умолчанию, получится, что адрес у обоих указывает на одну и ту же область памяти. Дальше, я думаю, понятно.
Обращение по индексу нужно, чтобы получить символ, находящийся в строке на определенном месте.
1
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 40
10.01.2012, 22:31  [ТС]
Тоесть в данном случае,в переменной (а) лежит адрес на первый элемент строки?И если использовать конструктор копирования,то у нас будет 2 переменных,в которых находится адрес,ссылающийся
на одинаковую область памяти?И если мы удалим переменную (а),то переменная (с) будет ссылаться на несуществующую область памяти?И тогда что происходит при перегрузке оператора?И зачем нужна ссылка?
Спасибо,это очень важно!!!
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
10.01.2012, 22:37
Не совсем, там структура данных объекта, в которой адрес том числе. В конструкторе копирования выделяется новый кусок памяти и туда копируется символьная строка из того объекта, который присваиваться. У каждого объекта получается по своей независимой копии.

Добавлено через 1 минуту
По ссылке строка передается, чтобы не нужно было лишний раз копировать всё содержание структуры данных объекта.
1
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 40
10.01.2012, 23:23  [ТС]
NoMasters, прости дружище,я не совсем понял что ты написал.Может быть на примере?

Добавлено через 35 минут
Может быть так правильно.Если делать стандартно, то массив будет один, а указателей на его начало два. Удаляя первый объект, мы удаляем указатель на начало массива и сам массив, после этого при попытке удалить второй объект мы получим ошибку, потому что там указатель ссылается на ничто. после перегрузки создается еще один массив, указатель в одном объекте ссылается на первый массив, во втором - на второй, и все ок работает
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
10.01.2012, 23:27
Можно открыть наконец книжку и прочитать о том, что такое объекты и как это работает. Предположим у нас есть какой-то такой класс строки:
C++
1
2
3
4
5
6
7
class String
{
public:
    size_t len;
    char *str;
    ...
};
Собственных данных у него только указатель на строку символов и её длина. При использовании стандартного конструктора копирования мы получим, что указатели в обоих объектах будут ссылаться на один и тот же кусок памяти. Чтобы этого избежать, напишем собственный конструктор копирования, который будет делать копии массива символов:
C++
1
2
3
4
5
6
7
8
9
String& String::operator = (const String& s)
{
    if (this != &s)
    {
        str = new char[s.len];
        memcpy(str, s.str, s.len);
    }
    return *this;
}
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
10.01.2012, 23:32
Поправте сигнатуру у оператора =. Строка в него должна передаваться по константной ссылке. Вы ведь не изменяете передаваемую строку в этом операторе? Иначе будут ошибки компиляции в некоторых случаях. например:
C++
1
2
3
const String str1;
String str2;
str2 = str1; // ошибка.
2
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
10.01.2012, 23:34
Точно, спасибо
0
31 / 31 / 16
Регистрация: 30.11.2010
Сообщений: 81
10.01.2012, 23:43
Начнем по порядку. Для начала разберем код, который вы привели в примере
Цитата Сообщение от pormonik Посмотреть сообщение
cout<<"\nОператор присваивания c=a\t"; * *
* * * * String c=a; * * * * * * * * * * * * * * * * * * * // Само присваивание
это НЕ присваивание.
В случаях, когда вы пишете
C++
1
2
String c=a; 
String c(a);
это вызывается конструктор копирования по умолчанию.
Далее рассматриваем начальную часть кода:
Цитата Сообщение от pormonik Посмотреть сообщение
class String {
String& operator = (String& s); * * * *// перегрузка оператора присваивания
}
опять же является неверной. Вы не можете осуществить возврат результата по ссылке при работе с локальными переменными данной функции.
Правильная запись будет выглядеть так:
C++
1
String operator = (String& s);
.
Теперь подробно про перегрузку оператора индексации.
Допустим у нас есть определение функции следующего вида:
C++
1
2
3
int& operator[](int n){
return arr[n]; //возвращаем некоторый элемент объекта класса, эмулирующего массив
}
Итак для чего это собственно надо и зачем возвращать элемент по ссылке:
C++
1
2
3
safearr sa1;//задал объект класса, эмулирующего массив
sa1[0]=10;//используем функцию слева от оператора равно(в этом случае возврат значения по ссылке нужен для инициализации элемента нашего массива).
int temp=sa1;//в этом случае мы используем функцию справа от знака равно и соответственно используем ее уже для получения значения в нашем массиве
и да, как верно заметил DU
Цитата Сообщение от DU Посмотреть сообщение
Строка в него должна передаваться по константной ссылке.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2012, 23:43
Помогаю со студенческими работами здесь

Оператор присваивания
Здравствуйте! Есть класс, в котором перегружены операции сложения и присваивания: void operator = (Matrix&amp;); Matrix operator +...

оператор присваивания
Привет всем ! Каким образом вызывается оператор присваивания, например, здесь: a = &quot;I &quot;; если в аргументе char*, а в...

Оператор присваивания
Добрый день! Помогите, пожалуйста, разобраться. Я не совсем понимаю работу перегруженного оператора присваивания в классе String, который...

Оператор присваивания
Почему в этом случае вызывается оператор присваивания Fraction f4; f4 = f1+f2+f3; а в другом не вызывается: ...

Оператор присваивания в c++
Такой вопрос, для каких классов следует явно перегрузить оператор присваивания??


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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 https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru