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

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! - C++

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.10.2011, 05:39     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! #1
Друзья! Обнаружил пробел в знаниях. Собсно, вопрос в теме. Дополню лишь: поля объекта меняются на нужные значения и безо всякого возврата *this; чяднт?
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
#include <stdio.h>
class x {
 public:
  x (int y):z(y){}
  int get () {return z;}
 
 
 //конструктор присваивания. Велят возвращать ссыль на объект или сам объект!
 void operator= (x& src) {z= src.z;}
 
 private:
  int z;
};
 
int main () {
 
 x x_0 (123);
 printf ("x_0.z= %d\n", x_0.get ());
 
 
 x x_1 (456);
 x_0= x_1;
 
 //а ни фига возвращать не надо, оказывается
 printf ("x_0.z= %d\n", x_0.get ());
 getchar ();
 return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 05:39     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого!
Посмотрите здесь:

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? C++
Метод не хочет возвращать объект типа класса которому он принадлежит C++
интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект C++
C++ Почему перегруженный оператор = должен возвращать ссылку на объект
классы. ошибка при вызове конструктора с параметрами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
28.10.2011, 06:34     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! #2
Если возвращать экземпляр по значению, то можно использовать возвращаемое значение в составных конструкциях присваивания. А если возвращать по ссылке, то можно использовать возвращаемое значение еще и как l-value. Пример (обрати внимание на строку 52):
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
#include <iostream>
#include <string>
 
class klass
{
public:
    klass(int);
    ~klass();
    klass& operator = (const klass&);
    void display() const;
private:
    static size_t cnt;
    int _i;
    size_t num;
};
 
size_t klass::cnt = 0;
 
klass::klass(int i)
    : _i(i), num(++cnt)
{
}
 
klass::~klass()
{
    --cnt;
}
 
klass& klass::operator = (const klass& rhs)
{
    _i = rhs._i;
    return *this;
}
 
void klass::display() const
{
    std::cout << "Constructed " << cnt << " klass instance(s)" << std::endl
              << "Instance #" << num << ": _i = " << _i << std::endl;
}
 
int main()
{
    std::cout << "Create 3 klass instances: " << std::endl;
    
    klass a(1), b(2), c(3);
    a.display();
    b.display();
    c.display();
 
    std::cout << "Using operator = " << std::endl;
    
    (a = b) = c;
    a.display();
            
    return 0;
}
А вообще, возвращать ты можешь что угодно
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.10.2011, 06:38  [ТС]     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! #3
разобрался, а l-value это что?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
28.10.2011, 06:48     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! #4
Цитата Сообщение от Nameless One Посмотреть сообщение
А вообще, возвращать ты можешь что угодно
вот пример:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
class stupid_rand
{
public:
    stupid_rand(int _l = 0, int _r = 0);
    int operator = (const stupid_rand&);
private:
    int l, r;
};
 
stupid_rand::stupid_rand(int _l, int _r)
    : l(_l), r(_r)
{
}
 
int stupid_rand::operator = (const stupid_rand& rhs)
{
    l = rhs.l;
    r = rhs.r;
 
    return rand() % (r - l + 1) + l;
}
 
int main()
{
    srand(time(NULL));
    
    // при присваивании этого объекта будет генерироваться
    // число из отрезка [-5, 5]
    const stupid_rand donor(-5, 5);
    // этот объект нужен только для вызова оператора присваивания
    stupid_rand acceptor;
 
    // генерация 15 чисел из заданного отрезка
    for(size_t i = 0; i < 15; ++i)
        std::cout << (acceptor = donor) << std::endl;
    
    return EXIT_SUCCESS;
}
Цитата Сообщение от kravam Посмотреть сообщение
разобрался, а l-value это что?
l-value & r-value
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.10.2011, 12:02     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! #5
Цитата Сообщение от kravam Посмотреть сообщение
конструктора присваивания
Вы ведь имели ввиду оператор присваивания, правда?

Добавлено через 23 минуты
kravam, вообще перегрузка операторов - это написание функций. Самых обычных функций, с почти теми же правилами, что применяются для функций. Единственное, на что смотрит компилятор - на арность (т.е. количество параметров). А выполнять эти функции могут что угодно и как угодно. Например, оператор сложения может принимать объекты двух разных классов и возвращать третий класс. А может вообще ничего не возвращать. Здесь вы вольны поступать, как вам захочется.
Вот пример класса, в котором оператор * выполняет не те действия, которые теоретически должен выполнять оператор разыменования, однако так сделать в данном случае было достаточно удобно:

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
#include <iostream>
 
class NextBinDigit
{
public:
    NextBinDigit(int foo):
    m_foo(foo),
    m_bin_len(s_bin_len(m_foo))
    {
    }
 
    char operator*()
    {
        return m_bin_len-- ? (((m_foo >> m_bin_len) & 0x01) + '0') : '0';
    }
 
    operator bool() const
    {
        return m_bin_len != 0;
    }
 
private:
    size_t s_bin_len(int num)
    {
        size_t len = 1;
 
        while (num >> 1 != 0)
        {
            ++len;
 
            num >>= 1;
        }
 
        return len;
    }
 
private:
    int m_foo;
    size_t m_bin_len;
};
 
int main()
{
    NextBinDigit nbd = 1234;
 
    while (nbd)
        std::cout << *nbd;
 
    std::cout << std::endl;
 
    return 0;
}
Yandex
Объявления
28.10.2011, 12:02     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого!
Ответ Создать тему
Опции темы

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