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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
#1

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

11.03.2014, 03:14. Просмотров 439. Ответов 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);
    }
Интересует меня возрашяемыий тип перегруженнои функций. Почему ето конструктор? Для меня больше понятно когда создается временная переменная и потом она возрашяется, а тут вот конструктор. Почему? Зачем?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2014, 03:14     Перегруженные функции. Возвращаемый тип
Посмотрите здесь:

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

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

Непонятный возвращаемый тип - C++
Расскажите какой тип должен быть у переменной idRe, чтобы можно было бы присвоить ему значение s.length , если s объект класса string?

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

Возвращаемый тип шаблона через std::common_type - C++
Вот отрывок моего кода. Не могу понять как определить возвращаемый тип объекта matrix. template&lt;typename V, typename U, size_t R, size_t...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 03:41     Перегруженные функции. Возвращаемый тип #4
Вернётся не то что нужно. Какое отношение temp имеет к объекту, который вызывает данный оператор?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 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++
Есть базовый класс. Есть наследник базового класса. В базовом классе есть два виртуальных метода - Get(int id) и Set(int id). В...

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

Для чего нужен возвращаемый тип в перегрузке ввода >> и почему без него него выдаётся ошибка? - C++
Для чего нужен возвращаемый тип в перегрузке ввода &gt;&gt;, какую роль он выполняет что без него него выдаётся ошибка. cin объект istream...

Перегруженные функции - C++
Написать перегруженную функцию, которая возвращает площадь квадрата, прямоугольника, треугольника и круга. Считать, что для вычисления...

Перегруженные функции - C++
Всем привет. Прошу помощи. Я сильно запутался, и не могу сделать пару аспектов в задание. Вот собственно само задание: Написать...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru