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

operator= возврат значения и просто ссылки - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.03.2013, 00:14     operator= возврат значения и просто ссылки #1
Здорова господа!
Снова пытаюсь чуток в С++ разобраться, с перегрузкой операций, снова ничерта непонятно.

от допустим класс
C++
1
2
3
4
5
6
7
8
9
10
class S
{
  int b;
 
  S& operator=(const S a)
  {
     b=a.b;
     return *this;
  }
};
ну допустим.
я записал
S a(3); //инициализировал допустим 3
S b;//пустой
b=a;//ну да b стал 3
ну и чо?

Вопрос:
Кода я в S& operator=(const S& a), меняю на S operator=(const S a) без ссылки, а просто возврат объекта, то у меня ничего не меняется все работает, а чото ж то происходит! Что?

Я как бы всегда думал, что возврат из функции определяется оператором return тоесть если мы хотим ссылку вернуть, то return &a; допустим, если значение, то return a; .
Ну а, что мы видим выше. Мы изменили значение которое возвращает функция, и не получили ошибку, как то странно. Как же мне вернуть тода не ссылку, а копию объекта? return *this это ссылка.
C++
1
2
3
4
5
6
7
8
S& operator=(const S& a)// ну это ссылка допустим
{
  return *this;
}
S operator=(const S& a)// тогда, что это копия?
{
  return *this;
}
Так почему это копия когда у них return одинаковый?

Ничерта не ясно господа просветите новичка!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 00:14     operator= возврат значения и просто ссылки
Посмотрите здесь:

Возврат ссылки на функцию. C++
Возврат значения С++ C++
Возврат ссылки C++
Создание ссылки и возврат из функции C++
Возврат ссылки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.03.2013, 00:40     operator= возврат значения и просто ссылки #2
тип возвращаемого объекта определяется типом возвращаемого объекта , а не тем, что написано в return.
чтобы увидеть разницу между возвратом по ссылке и возвратом по значению, напишите конструктор копирования для класса S, который бы на печать что-нибудь выводил. Так и увидите, что в одном случае вызывается конструктор копирования, а в другом -нет. Конструктор копирования может быть тяжелым и в этом случае возврат значения - лишнаяя ненужная работа. Кроме того, не совсем стандартно возвращать значения, хоть и можно. В таких случаях обычно советуют делать как для int. Вот простой тестик погоняйте со всеми вариантами оператора =
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
 
struct Foo
{
    int value;
 
    Foo(int val)
        : value(val)
    {
    }
 
    Foo(const Foo& other)
        : value(other.value)
    {
        std::cout << "copy ctor of Foo, value = " << other.value << std::endl;
    }
 
    /*
    Foo& operator = (const Foo& other)
    {
        value = other.value;
        return *this;
    }
    */
 
    Foo operator = (const Foo& other)
    {
        value = other.value;
        return *this;
    }
 
    /*
    const Foo& operator = (const Foo& other)
    {
        value = other.value;
        return *this;
    }
    */
 
    /*
    const Foo operator = (const Foo& other)
    {
        value = other.value;
        return *this;
    }
    */
};
 
int main()
{
    int i1 = 1;
    int i2 = 2;
    int i3 = 3;
    (i1 = i2) = i3;
 
    Foo foo1(1);
    Foo foo2(2);
    Foo foo3(3);
    (foo1 = foo2) = foo3;
 
    std::cout << "foo1 = " << foo1.value << std::endl;
    std::cout << "i1   = " << i1 << std::endl;
 
    return 0;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.03.2013, 01:45  [ТС]     operator= возврат значения и просто ссылки #3
Цитата Сообщение от DU Посмотреть сообщение
тип возвращаемого объекта определяется типом возвращаемого объекта , а не тем, что написано в return.
чтобы увидеть разницу между возвратом по ссылке и возвратом по значению, напишите конструктор копирования для класса S, который бы на печать что-нибудь выводил. Так и увидите, что в одном случае вызывается конструктор копирования, а в другом -нет. Конструктор копирования может быть тяжелым и в этом случае возврат значения - лишнаяя ненужная работа. Кроме того, не совсем стандартно возвращать значения, хоть и можно. В таких случаях обычно советуют делать как для int. Вот простой тестик погоняйте со всеми вариантами оператора =
C вариантами для const Foo& и const Foo не работаеть ошибка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    const Foo& operator = (const Foo& other)
    {
        value = other.value;
        return *this;
    }
    
 
    
    const Foo operator = (const Foo& other)
    {
        value = other.value;
        return *this;
    }
Ошибка с ними. ошибка: passing «const Foo» as «this» argument of «const Foo& Foo::operator=(const Foo&)» discards qualifiers [-fpermissive]

Добавлено через 3 минуты
Ладно я сам разбирусь
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.03.2013, 09:14     operator= возврат значения и просто ссылки #4
то, что не работает - так и было задуманно.
додумаетесь почему не компится - хорошо, не додумаетесь - ну не очень плохо
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.03.2013, 11:17  [ТС]     operator= возврат значения и просто ссылки #5
Цитата Сообщение от DU Посмотреть сообщение
то, что не работает - так и было задуманно.
додумаетесь почему не компится - хорошо, не додумаетесь - ну не очень плохо
ну не знаю мб потому, что const foo и const foo& которые могут быть присвоены переменной или объекту, токо при инициализации. А у нас при инициализации объекта вызывается конструкторы, тоесть const объекту, да мы вроде ни как не можем практически использовать эту функцию.
От к примеру:
const foo s;//создаем конст s
s=a;// толжно как бы вызваться foo const operator=(const foo&).
но как она может вызваться если s const? Никак потому, что s уже проинициализирована выше.
например можно использовать
const foo s=3 отак например для создания const объектов?
да и вообще я смотрю, чото конструкторов копий можно создать в классе всего один.

Кумарная тема. да и вообще нафиг нужен этот const создал без конст и норм. , я еще понимаю при передачи в функцию еще нужен сразу видно, где значение возвращается по ссылке, а где просто передается. Ну а возвращать из функции const какой смысл? Я не вижу смысла.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.03.2013, 13:27     operator= возврат значения и просто ссылки #6
ну так и есть.
operator = - неконстантная функция.
тип выражения (a = b) - константный объект в случае с Foo, у которого нельзя вызвать неконстантную функцию.
т.е. (a = b) = с; не компилируется. значит operator = должен возвращать что-то неконстантное. Ну и опираясь на поеведение с интами можно сделать вывод что правильные оператор должен возвращать неконстантную ссылку.
Yandex
Объявления
17.03.2013, 13:27     operator= возврат значения и просто ссылки
Ответ Создать тему
Опции темы

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