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

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

Войти
Регистрация
Восстановить пароль
 
yanyk1n
4329 / 1460 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
#1

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

09.05.2010, 16:20. Просмотров 1032. Ответов 14
Метки нет (Все метки)

Есть фрагмент кода:
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++
В понедельник последний день сдачи лабы. На выбор сделать одну из них: №1 Делать через классы и конструкторы. С использованием...

Конструкторы. синтаксис - C++
Добрый вечер! Не совсем понятно, как описываются конструкторы: что в круглых скобках, что в фигурных, когда нужно двоеточие. Например: ...

Указатели и конструкторы - C++
Всем доброго времени суток!!! Выполняя упражнение Лафоре 10 главы №1 написав и проверив всё столкнулся с такой проблемой. Проще...

Конструкторы по умолчанию. - C++
Здравствуйте, возник вопрос. Только что минут 10 въезжал что у меня не так. Суть вот в чем. Есть некий класс, в моем случае например digit....

Классы и конструкторы - C++
#include &lt;string.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; class automobile//создаём класс automobile ...

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

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

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

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

Добавлено через 28 секунд
Блин, надо апдейтить темы перед тем, как отвечать
yanyk1n
4329 / 1460 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
09.05.2010, 17:23  [ТС]     Конструкторы #12
Всё, всем спасибо, ответ я получил Исправьте, если что, в меня в моих рассуждениях:
Если я не определил свой копировщик, то
здесь
C++
1
Counter tmp(*this)
будет сгенерирован стандартный, который и копирует. Если я напишу свой собственный, то там уже будет использоваться мой. Всё верно?
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.05.2010, 17:25     Конструкторы #13
Цитата Сообщение от k1ry4 Посмотреть сообщение
будет сгенерирован стандартный, который и копирует
Конструктор копирования будет сгенерирован еще при компиляции. А здесь он будет просто вызван.
Цитата Сообщение от k1ry4 Посмотреть сообщение
Если я напишу свой собственный, то там уже будет использоваться мой
угумс
CyBOSSeR
Эксперт C++
2300 / 1670 / 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++
Помогите разобраться с классами, не пойму как мне сделать правильно конструкторы класса Application,выдвёт ошибки в его конструкторе,...

наследование. конструкторы - C++
#include &lt;iostream&gt; using namespace std; #include &lt;locale&gt; #include &lt;time.h&gt; #include &lt;windows.h&gt; class TArray { ...

Объявить конструкторы - C++
Доброго дня. Написал класс с полями и методами. Сделал тестовую программку - все работает. Добавил в класс несколько конструкторов (в .h...

Конструкторы в классе - C++
Не пойму, как работает наследование. Конструкторы не наследуются, а при вызове конструктора дочернего класса конструкторы...

конструкторы копий - C++
1) правильно ли я понял задание class noname { public: noname() : pstring(new std::string), i(0), d(0) {} noname(const...


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

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

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