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

Конструкторы - C++

Восстановить пароль Регистрация
 
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
09.05.2010, 16:20     Конструкторы #1
Есть фрагмент кода:
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
#include <iostream>
using namespace std;
 
class Counter
{
    public:
        Counter operator++(int); //постфикс
        Counter();
        ~Counter();
        Counter(int);
        Counter(Counter &_obj);
        int getVal();
    private:
        int val;
};
 
 
int main()
{
    Counter a(21);
    cout << "a = " << a.getVal() << endl;
    a++;
    cout << "a = " << a.getVal() << endl;    
    Counter b;
    cout << "b = " << b.getVal() << endl;
    Counter c(a);
    cout << "c = " << c.getVal() << endl;
    return 0;
}
    
 
Counter Counter::operator++(int temp)
{
    Counter tmp(*this);
    ++val;
    return tmp;
}
 
Counter::Counter()
{
    val = 12;
}
 
Counter::~Counter()
{
}
 
Counter::Counter(int _val)
{
    val = _val;
}
 
Counter::Counter(Counter &_obj)
{
    val = _obj.val;     
}
 
int Counter::getVal()
{
    return val;
}
Он работает, ошибок нет, результат такой:
Bash
1
2
3
4
a = 21
a = 22
b = 12
c = 22
Мне непонятно одно. Так как мы определили собственный конструктор-копировщик:
C++
1
Counter::Counter(Counter &_obj)
то это возможно как-нибудь влияет на конструктор в operator++:
C++
1
Counter tmp(*this);
Прошу, как можно доходчивей объясните, в чём здесь фишка. Уже третий час никак не могу вьехать.

Да, кстати, почему нельзя объявить конструктор
C++
1
Counter::Counter(Counter _obj)
Мы же принимаемый объект не изменяем никак, поэтому без разницы, как передавать - по значению или по ссылке. Заранее всем спасибо за ответ
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2010, 16:20     Конструкторы
Посмотрите здесь:

Конструкторы C++
конструкторы C++
C++ конструкторы
C++ конструкторы
Конструкторы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.05.2010, 16:51     Конструкторы #2
Цитата Сообщение от k1ry4 Посмотреть сообщение
Counter tmp(*this);
это вызывается конструктор копирования c передачей ссылки на текущйи объект
Цитата Сообщение от k1ry4 Посмотреть сообщение
Мы же принимаемый объект не изменяем никак, поэтому без разницы, как передавать - по значению или по ссылке.
Хех... А ты не забыл о том, что передавая объект по значению ты создаешь его копию? Именно поэтому передача объектов по значению - хреновая идея. И это не зависит от того, конструктор это, или нет.

Добавлено через 6 минут
К слову, раз тебя беспокоит изменени объекта - сделай конструктор с const Counter &_obj
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
09.05.2010, 16:58  [ТС]     Конструкторы #3
Цитата Сообщение от Vourhey Посмотреть сообщение
c передачей ссылки на текущйи объект
Это я понял... Но ведь в качестве параметра мы передаём объект... А это совпадает с конструктором-копировщиком. Вот в чём отличие конструкторов:
C++
1
Counter a(b)
и
C++
1
Counter tmp(*this)
Здесь же по сути одна структура конструктора... и a, и *this являются Counter...


Цитата Сообщение от Vourhey Посмотреть сообщение
А ты не забыл о том, что передавая объект по значению ты создаешь его копию?
Так нам важно получить значение копии, а не изменить её. Изменяется же только val создаваемого объекта...
Цитата Сообщение от Vourhey Посмотреть сообщение
А ты не забыл о том, что передавая объект по значению ты создаешь его копию?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.05.2010, 17:02     Конструкторы #4
Цитата Сообщение от k1ry4 Посмотреть сообщение
Вот в чём отличие конструкторов:
В конструкторах отличия нет. Вызовется все равно конструктор копирования с передачей по ссылке.
Цитата Сообщение от k1ry4 Посмотреть сообщение
ак нам важно получить значение копии, а не изменить её
Вот именно. Так нахрена нам целиком делать копию объекта? У нас че, циклы процессора лишние? Или у тебя память лишняя?
Цитата Сообщение от k1ry4 Посмотреть сообщение
Изменяется же только val создаваемого объекта...
Так изменяй! То, что ты меняешь новый объект вообще никак не связано с тем, как передавать параметры. Ссылка тут не для того, чтобы ты объект менял. а для того, чтобы ты не создавал сущности без надобности.
Я выше привел пример, как обезопасить объект от изменения.
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
09.05.2010, 17:03  [ТС]     Конструкторы #5
Vourhey, а здесь тогда что вызывается:
C++
1
Counter a(b)
?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
09.05.2010, 17:06     Конструкторы #6
конструктор копирования..
b - передается по ссылке.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.05.2010, 17:09     Конструкторы #7
k1ry4, такой же конструктор копирования. Я написал уже
Цитата Сообщение от Vourhey Посмотреть сообщение
В конструкторах отличия нет. Вызовется все равно конструктор копирования с передачей по ссылке.
в обоих случаях.
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
09.05.2010, 17:11  [ТС]     Конструкторы #8
Vourhey, но если я НЕ напишу свой конструктор копирования, то код
C++
1
Counter tmp(*this)
всё равно работать будет. Но я же, по сути, переопределил эту строку, что в ней вызывается не тот конструктор, который был, а тот, который я сам определил в Counter(Counter &obj);
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.05.2010, 17:15     Конструкторы #9
Цитата Сообщение от k1ry4 Посмотреть сообщение
но если я НЕ напишу свой конструктор копирования, то код
C++
1
Counter tmp(*this)
всё равно работать будет.
Если не определен пользовательский конструктор копирования, то он генерируется компилятором. Сгенерированный конструктор ничего умного не делает, просто почленно копирует объект-источник в объект-приемник.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
09.05.2010, 17:19     Конструкторы #10
который был, а тот, который я сам определил в Counter(Counter &obj);
Так и должно быть..

Если ты не определил собственный конструктор копирования,
компилятор создаст конструктор копирования по умолчанию.

Все функции включая конструкторы находятся в единственном экземпляре
для всех объектов класса.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.05.2010, 17:20     Конструкторы #11
Цитата Сообщение от k1ry4 Посмотреть сообщение
Vourhey, но если я НЕ напишу свой конструктор копирования, то код
Код C++
1
Counter tmp(*this)
всё равно работать будет.
Потому что конструкторы все равно есть

Добавлено через 28 секунд
Блин, надо апдейтить темы перед тем, как отвечать
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
09.05.2010, 17:23  [ТС]     Конструкторы #12
Всё, всем спасибо, ответ я получил Исправьте, если что, в меня в моих рассуждениях:
Если я не определил свой копировщик, то
здесь
C++
1
Counter tmp(*this)
будет сгенерирован стандартный, который и копирует. Если я напишу свой собственный, то там уже будет использоваться мой. Всё верно?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.05.2010, 17:25     Конструкторы #13
Цитата Сообщение от k1ry4 Посмотреть сообщение
будет сгенерирован стандартный, который и копирует
Конструктор копирования будет сгенерирован еще при компиляции. А здесь он будет просто вызван.
Цитата Сообщение от k1ry4 Посмотреть сообщение
Если я напишу свой собственный, то там уже будет использоваться мой
угумс
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.05.2010, 17:26     Конструкторы #14
Цитата Сообщение от k1ry4 Посмотреть сообщение
Если я не определил свой копировщик, то
здесь
C++
1
Counter tmp(*this)
будет сгенерирован стандартный, который и копирует. Если я напишу свой собственный, то там уже будет использоваться мой. Всё верно?
Все верно. Только он будет сгенерирован не "здесь", а "вообще". "здесь" же просто вызов конструктора копирования.

Добавлено через 1 минуту
Vourhey, ты прав, надо обновлять темы при ответе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2010, 17:27     Конструкторы
Еще ссылки по теме:

C++ Конструкторы
C++ Конструкторы C++
C++ Конструкторы С++

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

Или воспользуйтесь поиском по форуму:
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
09.05.2010, 17:27     Конструкторы #15
Блин, надо апдейтить темы перед тем, как отвечать
угумс
Yandex
Объявления
09.05.2010, 17:27     Конструкторы
Ответ Создать тему
Опции темы

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