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

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

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
#1

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

28.10.2011, 05:39. Просмотров 539. Ответов 4
Метки нет (Все метки)

Друзья! Обнаружил пробел в знаниях. Собсно, вопрос в теме. Дополню лишь: поля объекта меняются на нужные значения и безо всякого возврата *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++
Доброго времени суток! Перегрузка присваивания: class alpha { private: int data; public: alpha() // конструктор без...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект - C++
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня , так как учусь работать с указателями)...

Ошибка при перегрузка конструктора. Родительский объект инициализирует поле по умолчанию - C++
простейший объект field с двумя полями int является полем класса Capp. поле с типом field создается и конструируется по умолчанию без...

Может ли объект-член, или объект-элемент достучаться к содержащему его? - C++
Предположим, class A { ... }; class B { .... A a; ... };

Основы: указатель на объект или объект, что выбрать? - C++
Не до конца понимаю (или вообще не понимаю) когда лучше использовать указатель на объект, а когда объект. Например: // есть класс ...

Что возвращать из vector-a указателей, если объект не найден? - C++
Все добра! Подскажите что возвращать если элемент не найден ? class A { public: A(int val) { a = val; } int a; };

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
28.10.2011, 06:38  [ТС]     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! #3
разобрался, а l-value это что?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 12:02     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого!
Еще ссылки по теме:

Почему перегруженный оператор = должен возвращать ссылку на объект - C++
Объясните доступно пожалуйста. Почему перегруженный оператор= должен возвращать ссылку на объект? А оператор+ может возвращать как...

Метод не хочет возвращать объект типа класса которому он принадлежит - C++
Есть класс matrix и один из методов этого класса plus который возвращает объект типа matrix Но корректно этого делать не хочет Ошибка...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt; endl; this-&gt;setName(); //все...

вызов конструктора, по указателю на объект - C++
class qwe { public: qwe() {} qwe(char * name, int a, int b):_name(strdup(name)), _a(a), _b(b) {} private: char * _name; ...

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? - C++
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

Используйте объект orange типа Tfruit для инициализации объекта grapefruit с помощью конструктора копирования - C++
Есть класс с именем Tfruit и объект orange типа Tfruit. Используйте orange для инициализации нового объекта на имя grapefruit с помощью...


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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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     при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого!
Ответ Создать тему
Опции темы

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