Форум программистов, компьютерный форум CyberForum.ru

Перегруженные функции. Возвращаемый тип - C++

Восстановить пароль Регистрация
 
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
11.03.2014, 03:14     Перегруженные функции. Возвращаемый тип #1
Добро всем времени суток. Изучаю Р.Лаворе книгу и наткнулся на непонятныий мне аспект.
Вот есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    String(char s[])
    {
        strcpy_s(str, s);
    }
    String operator+=(String ss)
    {
        if (strlen(str) + strlen(ss.str) < MAX)
        {
            strcat_s(str, ss.str);
        }
        return String(str);
    }
Интересует меня возрашяемыий тип перегруженнои функций. Почему ето конструктор? Для меня больше понятно когда создается временная переменная и потом она возрашяется, а тут вот конструктор. Почему? Зачем?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 03:25     Перегруженные функции. Возвращаемый тип #2
Вы бы как написали?
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
11.03.2014, 03:30  [ТС]     Перегруженные функции. Возвращаемый тип #3
Чтото вроде етого:
C++
1
2
3
4
5
6
7
8
9
String operator+=(String ss)
{
    String temp;
    if (strlen(str) + strlen(ss.str) < MAX)
    {
        strcat_s(temp.str, ss.str);
    }
    return temp;
}
И плюс не нада конструктора с одним параметром использовать.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 03:41     Перегруженные функции. Возвращаемый тип #4
Вернётся не то что нужно. Какое отношение temp имеет к объекту, который вызывает данный оператор?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.03.2014, 03:45     Перегруженные функции. Возвращаемый тип #5
Цитата Сообщение от xvivax Посмотреть сообщение
Почему ето конструктор? Для меня больше понятно когда создается временная переменная и потом она возрашяется, а тут вот конструктор.
возвращается не конструктор, возвращается анонимный объект

Добавлено через 2 минуты
Цитата Сообщение от xvivax Посмотреть сообщение
Почему? Зачем?
такой прием позволяет компилятору задействовать оптимизацию(RVO/NRVO) и убрать лишнее копирование при возврате из функции
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
11.03.2014, 04:30  [ТС]     Перегруженные функции. Возвращаемый тип #6
Мое мнение было такое, что в обоих случаях данныий объект присоединит строку второго объекта, которая была передана как аргумент.

Добавлено через 29 минут
Цитата Сообщение от Jupiter Посмотреть сообщение
возвращается не конструктор, возвращается анонимный объект
По сути етот анонимныий объект ето таже самая temp переменная, да? Тоесть ети два способа делают тоже самое?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 04:49     Перегруженные функции. Возвращаемый тип #7
Цитата Сообщение от xvivax Посмотреть сообщение
Мое мнение было такое, что в обоих случаях данныий объект присоединит строку второго объекта, которая была передана как аргумент.
Где у вас, во втором случае, используется строка объекта, который вызывает оператор? У вас в орераторе создаётся локальный объект с пустой строкой, потом эта пустая строка соединяется со строкой параметра, копия temp, с такой соединённой строкой, возвращается в никуда. Как эти действия могут отразиться на строке объекта, который вызывает оператор?

Добавлено через 7 минут
В первом случае, строка объекта, который вызвал оператор, соединяется со строкой параметра (т.е., строка объекта, который вызвал оператор уже состоит из двух строк). Дальше можно хоть вообще ничего не возвращать, у объекта, который вызвал оператор уже новая строка. Возврат копии объекта, с новой строкой, делается для того, чтобы этот оператор можно было использовать в цепочке действий (c = a += b).
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
11.03.2014, 05:18  [ТС]     Перегруженные функции. Возвращаемый тип #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Где у вас, во втором случае, используется строка объекта, который вызывает оператор? У вас в орераторе создаётся локальный объект с пустой строкой, потом эта пустая строка соединяется со строкой параметра, копия temp, с такой соединённой строкой, возвращается в никуда. Как эти действия могут отразиться на строке объекта, который вызывает оператор?
Насчет второго способа понял, я там кое что забыл добавить
C++
1
2
3
4
5
6
7
8
9
10
String operator+=(String ss)
{
    String temp;
    if (strlen(str) + strlen(ss.str) < MAX)
    {
        strcpy_s(temp.str, str);
        strcat_s(temp.str, ss.str);
    }
    return temp;
}
Если вот так то ети два метода будут индетичны?

Добавлено через 2 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Возврат копии объекта, с новой строкой, делается для того, чтобы этот оператор можно было использовать в цепочке действий (c = a += b).
А если я вот так напишу ето будет тоже самое?
C++
1
2
3
4
5
6
7
8
9
10
11
12
String(char s[])
    {
        strcpy_s(str, s);
    }
    String operator+=(String ss)
    {
        if (strlen(str) + strlen(ss.str) < MAX)
        {
            strcat_s(str, ss.str);
        }
        return str;
    }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 05:30     Перегруженные функции. Возвращаемый тип #9
Цитата Сообщение от xvivax Посмотреть сообщение
Насчет второго способа понял, я там кое что забыл добавить
Добавка не меняет того, что строка str (объекта, который вызывает оператор), в операторе не меняется, а должна именно она изменится.

Добавлено через 5 минут
Цитата Сообщение от xvivax Посмотреть сообщение
А если я вот так напишу ето будет тоже самое?
Цитата Сообщение от xvivax Посмотреть сообщение
return str;
Возвращаемое значение должно быть не строка, а объект String.

Добавлено через 51 секунду
В конце концов прийдёте к Лафоре...
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
11.03.2014, 05:30  [ТС]     Перегруженные функции. Возвращаемый тип #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Добавка не меняет того, что строка str (объекта, который вызывает оператор), в операторе не меняется, а должна именно она изменится.
Точно! Тоесть я тока что могу так ето присвоить новому объекту ету возрашяемое значение, а само значение str никак не изменится, правилно?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 05:33     Перегруженные функции. Возвращаемый тип #11
Цитата Сообщение от xvivax Посмотреть сообщение
Тоесть я тока что могу так ето присвоить новому объекту ету возрашяемое значение, а само значение str никак не изменится, правилно?
Это о чём?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2014, 16:58     Перегруженные функции. Возвращаемый тип
Еще ссылки по теме:

Перегруженные функции C++
В наследнике(-ах) требуется изменить возвращаемый тип этих функций. C++
C++ Возвращаемый тип конструктора копирования в абстрактном классе

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

Или воспользуйтесь поиском по форуму:
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
11.03.2014, 16:58  [ТС]     Перегруженные функции. Возвращаемый тип #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Это о чём?
О втором примере
Yandex
Объявления
11.03.2014, 16:58     Перегруженные функции. Возвращаемый тип
Ответ Создать тему
Опции темы

Текущее время: 01:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru