2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
1

Возврат ссылки от функции перегруженного оператора

03.08.2017, 16:35. Показов 1388. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, меня интересует вопрос, когда функция-член класса, к примеру перегруженного оператора присваивания
возвращает ссылку, зачем так делать? Это нужно для того, чтобы создавать цепочку из операторов присваивания? К примеру:

a = b = c; где все переменные это объекты класса

То есть когда функция возвращает ссылку после b = c на объект класса, функция перегруженного оператора
принимает в качестве аргумента ее же значение для выполнения a = b? Или нет?

Вот кусок кода из книги:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
inline String&
String::operator=( const String &rhs )
{
if ( this != &rhs ) {
delete [] _string;
_size = rhs._size;
if ( ! rhs._string )
_string = 0;
else {
_string = new char[ _size + 1 ];
strcpy( _string, rhs._string );
}
}
return *this; }

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2017, 16:35
Ответы с готовыми решениями:

Возврат ссылки из функции
Изучаю С++, знаю С. Вот такой простенький вопросик есть. В чем вообще разница: class Str {...

Возврат константной ссылки из функции
Можно ли из функции возвращать константную ссылку? Есть след. классы: class A { /*чтото тяжёлое,...

Возврат ссылки на указатель из функции
#include <iostream> int*& getPtrRef(int*& ref) { int*& cpy = ref; std::cout << &ref...

Создание ссылки и возврат из функции
Есть вот такая функция, возвращает максимальный элемент. template <typename Type> inline const...

9
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
03.08.2017, 16:43 2
Цитата Сообщение от FishZone Посмотреть сообщение
Вот кусок кода из книги
бросайте книгу, примеры кода в ней содержат неопределённое поведение.
Цитата Сообщение от FishZone Посмотреть сообщение
Это нужно для того, чтобы создавать цепочку из операторов присваивания?
да.
-0.50
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
03.08.2017, 16:59  [ТС] 3
GbaLog-, хм, понял вас.. ну я пока только начинаю изучение языка, пока буду по этой книге,
а то жалко как-то бросать( А какую бы вы посоветовали? Спасибо
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
03.08.2017, 18:42 4
Цитата Сообщение от GbaLog- Посмотреть сообщение
примеры кода в ней содержат неопределённое поведение.
В смысле? Что за книга?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
03.08.2017, 18:47 5
Цитата Сообщение от nd2 Посмотреть сообщение
В смысле? Что за книга?
стандартном не рекомендуется начинать имена переменных с нижнего подчёркивания.
т.к. такие названия используются разработчиками компиляторов.
а что за книга я не в курсе.
0.50
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
03.08.2017, 21:42  [ТС] 6
GbaLog-, книга Стэнли Липпмана "C++ для начинающих". Честно говоря, какой год не помню, но искал самое последнее издание
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
03.08.2017, 22:22 7
FishZone, видимо и в самом деле старое читаешь, у него последняя книга называется
Язык программирования C++. Базовый курс

Добавлено через 2 минуты
Не хочу тебя пугать, но придется тебе ее с самого начала читать, ибо новой инфы очень много
1
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
03.08.2017, 23:06  [ТС] 8
Ferrari F1, спасибо, та не страшно особо, если будет попадаться undefined behaviour, буду в сети искать причины и записывать отдельно, а сначала я чисто для себя все делаю, потом уже буду на новое переходить
0
Заблокирован
03.08.2017, 23:24 9
Цитата Сообщение от GbaLog- Посмотреть сообщение
стандартном не рекомендуется начинать имена переменных с нижнего подчёркивания.
Вы про
Цитата Сообщение от Стандарт
In addition, some identifiers are reserved for use by C ++ implementations and shall not be used otherwise; no diagnostic is required.
  • Each identifier that contains a double underscore __ or begins with an underscore followed by an uppercase letter is reserved to the implementation for any use.
  • Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
???

Здесь нет ни double underscode, ни underscode followed by an uppercase letter. И поля классов определённо не находятся in the global namespace.

Добавлено через 12 минут
Но тем не менее, я соглашусь с
Цитата Сообщение от GbaLog- Посмотреть сообщение
бросайте книгу
self-assignment test — это отвратительно. move/copy-and-swap (с параметром "по значению") лучше.
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
04.08.2017, 00:03 10
Цитата Сообщение от FishZone Посмотреть сообщение
перегруженного оператора присваивания
возвращает ссылку, зачем так делать?
Так делают для того что бы семантика присваивания для разрабатываемого типа не отличалась от семантики присваивания встроенных типов. Вы же, как автор разрабатываемого нового типа, можете возвращать что угодно, хоть void, но клиентов вашого такого класса, это скорее всего, поставит в недоумение и, возможно, вызовет у них дурные мысли о вас как о программисте.
Да, ну и плюс, наверное же надо писать с учетом безопасности:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
String& String::operator = (const String &rhs)
{
    if ( this != &rhs ) 
    {
        char* new_storage = new char[rhs._size + 1];
 
        delete [] _string;
        _string =  new_storage;
        _size = rhs._size;
 
        strcpy(_string, rhs._string );
    }
    return *this; 
}
1
04.08.2017, 00:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2017, 00:03
Помогаю со студенческими работами здесь

Вызов перегруженного оператора
В классе Ellipse есть перезагрузка, не могу ее вызвать в main вот само задание: Создать класс...

Использование перегруженного оператора <<
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;algorithm&gt;...

Возврат из функции ссылки на экземпляр класса
Здравствуйте, прошу помочь в разъяснении не понятной конструкции.Искал в интернете не нашел ничего...

Странный вывод перегруженного оператора
Здравствуйте. Делаю цепочки вывода, но получается вот что: Почему выводится число 0x605508 ?...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru