Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 07.09.2013
Сообщений: 25
1

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

11.03.2014, 03:14. Показов 637. Ответов 11
Метки нет (Все метки)

Добро всем времени суток. Изучаю Р.Лаворе книгу и наткнулся на непонятныий мне аспект.
Вот есть код:
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);
    }
Интересует меня возрашяемыий тип перегруженнои функций. Почему ето конструктор? Для меня больше понятно когда создается временная переменная и потом она возрашяется, а тут вот конструктор. Почему? Зачем?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2014, 03:14
Ответы с готовыми решениями:

Функции, возвращаемый тип
Как сделать так, что бы функция возвращала разный тип данных, в зависимости от некой глобальной...

Непонятный возвращаемый тип
Расскажите какой тип должен быть у переменной idRe, чтобы можно было бы присвоить ему значение...

Возвращаемый тип по умолчанию
Приветствую всех! В книге Р. Лафоре &quot;Объектно-ориентированное программирование в C++&quot; прочитал...

Перегрузка оператора - возвращаемый тип
class A { private: int x; public: A&amp; operator += (int y); }; A&amp; A::operator...

11
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 03:25 2
Вы бы как написали?
0
1 / 1 / 1
Регистрация: 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;
}
И плюс не нада конструктора с одним параметром использовать.
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 03:41 4
Вернётся не то что нужно. Какое отношение temp имеет к объекту, который вызывает данный оператор?
0
Каратель
Эксперт С++
6601 / 4020 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.03.2014, 03:45 5
Цитата Сообщение от xvivax Посмотреть сообщение
Почему ето конструктор? Для меня больше понятно когда создается временная переменная и потом она возрашяется, а тут вот конструктор.
возвращается не конструктор, возвращается анонимный объект

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

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

Добавлено через 7 минут
В первом случае, строка объекта, который вызвал оператор, соединяется со строкой параметра (т.е., строка объекта, который вызвал оператор уже состоит из двух строк). Дальше можно хоть вообще ничего не возвращать, у объекта, который вызвал оператор уже новая строка. Возврат копии объекта, с новой строкой, делается для того, чтобы этот оператор можно было использовать в цепочке действий (c = a += b).
0
1 / 1 / 1
Регистрация: 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;
    }
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 05:30 9
Цитата Сообщение от xvivax Посмотреть сообщение
Насчет второго способа понял, я там кое что забыл добавить
Добавка не меняет того, что строка str (объекта, который вызывает оператор), в операторе не меняется, а должна именно она изменится.

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

Добавлено через 51 секунду
В конце концов прийдёте к Лафоре...
0
1 / 1 / 1
Регистрация: 07.09.2013
Сообщений: 25
11.03.2014, 05:30  [ТС] 10
Цитата Сообщение от alsav22 Посмотреть сообщение
Добавка не меняет того, что строка str (объекта, который вызывает оператор), в операторе не меняется, а должна именно она изменится.
Точно! Тоесть я тока что могу так ето присвоить новому объекту ету возрашяемое значение, а само значение str никак не изменится, правилно?
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 05:33 11
Цитата Сообщение от xvivax Посмотреть сообщение
Тоесть я тока что могу так ето присвоить новому объекту ету возрашяемое значение, а само значение str никак не изменится, правилно?
Это о чём?
0
1 / 1 / 1
Регистрация: 07.09.2013
Сообщений: 25
11.03.2014, 16:58  [ТС] 12
Цитата Сообщение от alsav22 Посмотреть сообщение
Это о чём?
О втором примере
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2014, 16:58

Возвращаемый тип как rvalue reference
Нашел интересный пример в книге Мейерса Эффективный и современный С++. class Widget { ...

Возвращаемый тип шаблона через std::common_type
Вот отрывок моего кода. Не могу понять как определить возвращаемый тип объекта matrix....

Возвращаемый тип конструктора копирования в абстрактном классе
Здравствуйте! Есть абстрактный класс (с &quot;чистыми&quot; виртуальными функциями), и в нем необходимо...

что за возвращаемый тип, и как работает функция?
pair&lt;string, string&gt; splitExpression(string expr) { stringstream ss; ss &lt;&lt; expr; pair&lt;string,...

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

Почему перегруженные шаблоны функций должны возвращать один и тот же тип?
Так как я еще очень плохо знаю шаблоны и никак не могу понять. Почему у всех перегруженных...


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

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

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