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

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

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

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

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

Функции, возвращаемый тип - 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; ...

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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