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

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

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

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

28.10.2011, 05:39. Просмотров 596. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 05:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! (C++):

Когда нужно/не нужно возвращать объект при перегрузке присваивания? - C++
Доброго времени суток! Перегрузка присваивания: class alpha { private: int data; public: alpha() // конструктор без...

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

Создать обЪект класса , у которого в параметрах конструктора объект этого же класса - Delphi
Вот код: TOgmGraphicsClass = class of TOgmGraphicsBlock; TOgmGraphicsBlock = class(TOgmGraphicsItem) (Объект класса...

При попытке создать объект obj=Server.CreateObject('Name.ClassName') Возникает ошибка, 'Объект не поддерживает это свойство или метод.' - C# ASP.NET
При попытке создать объект obj=Server.CreateObject('Name.ClassName') Возникает ошибка, 'Объект не поддерживает это свойство или метод.'...

Если внутри функции создается объект с помощью gcnew, он создается один раз или при каждом вызове? - C++/CLI
Обработчик по нажатию кнопки Visual C++ 2010 private: System::Void but1_Click(System::Object^ sender, System::EventArgs^ e) { ...

Ошибка при описании структуры (Объект this не может использоваться до присваивания значений) - C#
Что-то я не понял чего это студии мой конструктор не нравится: struct CountInfo { public char symbol { get; private...

4
Nameless One
Эксперт С++
5783 / 3432 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
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;
}
А вообще, возвращать ты можешь что угодно
1
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
28.10.2011, 06:38  [ТС] #3
разобрался, а l-value это что?
0
Nameless One
Эксперт С++
5783 / 3432 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
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
1
silent_1991
Эксперт С++
5005 / 3063 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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;
}
1
28.10.2011, 12:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 12:02
Привет! Вот еще темы с ответами:

Нужна подсказка по коду. Одним из полей формы надо сделать объект генерик класса - C#
Вот собственно мой быдлокод, в мейне тыкаете на New, после чего можно создать файлик, в файлике должна происходить работа с каким либо...

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

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

Если объект добавлять в 2 контейнера, то в них будет ссылка или новый объект? - Java
Есть объект - obj. Последовательно добавляю его в два контейнера container1.add(obj); container2.add(obj); Если я удалю...


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

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

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