Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
DaskOFF
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
1

конструкторы копий

11.08.2012, 15:56. Просмотров 959. Ответов 22
Метки нет (Все метки)

1) правильно ли я понял задание
конструкторы копий

C++
1
2
3
4
5
6
7
8
9
10
class noname        
{
public:
    noname() : pstring(new std::string), i(0), d(0) {}
    noname(const noname&);
private:
    std::string *pstring;
    int i;
    double d;
};
C++
1
2
#include "cla.h"
noname::noname(const noname& orig) : i(orig.i), d(orig.d) { *pstring = *orig.pstring; }
2)Прочитал по поводу конструктора копий, и тут затрагивался синтезируемый конструктор копий.
Как тут написано
В большинстве случаев синтезируемый конструктор копий осуществляет именно те действия, которые необходимы.
если не используются указатели.
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2012, 15:56
Ответы с готовыми решениями:

Конструктор копий
Добрый день! Пытаюсь разобраться с конструктором копий, а именно: когда его...

Конструктор копий
Добрый день, изучая работу со списками и классы, дошел до такой проблемы:...

констр. копий
#include <conio.h> #include <iostream> using namespace std; class A { int...

Конструктор копий
Можно ли вызвать в конструкторе копий, конструктор, если объекту нечего...

Конструктор копий по умолчанию.
Почему, когда в vc++ vdfsadsad Добавлено через 46 секунд Почему если идёшь...

22
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 16:00 2
Цитата Сообщение от DaskOFF Посмотреть сообщение
правильно ли я понял задание
Да
Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Нет. Всего лишь мартышкин труд.
1
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,412
Записей в блоге: 17
11.08.2012, 16:02 3
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Думаю нет...
Но зачем? Думаю это только будит сбивать с толку людей читающих ваш код...

Говорят полезно всегда прописывать деструктор даже, если нет динамических объектов внутри класса.
1
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
11.08.2012, 16:04 4
Цитата Сообщение от DaskOFF Посмотреть сообщение
правильно ли я понял задание
Задание понял правильно, а реализация содержит ошибку. Объект *psting не был создан, а в него производится присваивание.

Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Это не будет ошибкой (при условии, что реализован он правильно). Но при добавлении членов к классу придётся не забывать обновлять конструктор копий, иначе часть членов не будет копироваться.
1
ValeryS
Модератор
7272 / 5526 / 692
Регистрация: 14.02.2011
Сообщений: 18,725
11.08.2012, 16:05 5
Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
если работаешь с памятью то создавать надо
1
DaskOFF
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
11.08.2012, 16:09  [ТС] 6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Задание понял правильно, а реализация содержит ошибку. Объект *psting не был создан, а в него производится присваивание.
?
C++
1
noname::noname(const noname& orig) : i(orig.i), d(orig.d) { pstring = new std::string(*orig.pstring); }
0
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
11.08.2012, 16:10 7
Ага. Или так:
C++
1
noname::noname(const noname& orig) : i(orig.i), d(orig.d), pstring(new std::string(*orig.pstring)) {}
1
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.08.2012, 16:30 8
Avazart, Не сказал бы, что это так уж полезно.) Нужно прописывать деструктор, если есть что уничтожать или же класс подразумевается как базовый для некоторого другого.
2
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,412
Записей в блоге: 17
11.08.2012, 17:00 9
Avazart, Не сказал бы, что это так уж полезно.) Нужно прописывать деструктор, если есть что уничтожать или же класс подразумевается как базовый для некоторого другого.
Утечка памяти (Expression: _CrtIsValidHeapPointer(pUserData))
1
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
11.08.2012, 17:26 10
Avazart, там беда в отсутствии именно виртуального деструктора. Да, если есть хотя бы небольшой шанс, что класс будет базовым и использоваться полиморфно, то деструктор обязательно надо создавать. Но не для того, чтобы просто его создать, а для того, чтобы сделать его виртуальным.
1
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,412
Записей в блоге: 17
11.08.2012, 18:02 11
Упустил момент...
Ну а если не объявить вообще в наследуемом классе, то что будет,или что страшного может быть?
0
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
11.08.2012, 18:05 12
В наследниках можно не объявлять, если деструктор ничего не делает. Отменить виртуальность деструктора не удастся.
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,412
Записей в блоге: 17
11.08.2012, 18:06 13
Я имею ввиду в базовом...
0
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
11.08.2012, 18:12 14
Если в базовом деструктор отсутствует, то при неполиморфном использовании ничего плохого не случиться. Но если объект потомка будет удаляться через указатель на базовый класс (то есть полиморфно), то при отсутствии виртуального деструктора в базовом классе будет вызван деструктор именно базового класса (такой вот парадокс), а деструктор потомка вызван не будет. Отсюда возможная утечка ресурсов, выделенных в конструкторе потомка.
1
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,412
Записей в блоге: 17
11.08.2012, 18:28 15
Отсюда возможная утечка ресурсов
Даже если обоих классах отстутствуют динамически созданные объекты ?
0
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
11.08.2012, 18:35 16
Цитата Сообщение от Avazart Посмотреть сообщение
Даже если обоих классах отстутствуют динамически созданные объекты ?
В принципе да. Если память динамически выделяют объекты, которые являются членами класса-потомка. Раз деструктор потомка не вызывается, то и его члены не будут разрушены (для них тоже не будут вызваны деструкторы).

Добавлено через 44 секунды
Правда теперь я углубился в теорию, пойду проверю на практике
1
DaskOFF
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
11.08.2012, 18:36  [ТС] 17
Цитата Сообщение от grizlik78 Посмотреть сообщение
В принципе да. Если память динамически выделяют объекты, которые являются членами класса-потомка. Раз деструктор потомка не вызывается, то и его члены не будут разрушены (для них тоже не будут вызваны деструкторы).

Добавлено через 44 секунды
Правда теперь я углубился в теорию, пойду проверю на практике
напиши потом что получится, я как раз к деструкторам перехожу
0
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
11.08.2012, 18:57 18
Вот. В случае объекта с номером 3 вызывается только деструктор базового объекта, в отличие от 1, 2 и 4
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
#include <iostream>
 
using namespace std;
 
class Member
{
public:
    Member(int v) : v(v) { cout << "Member constructor (" << v << ")" << endl; }
    ~Member() { cout << "Member destructor (" << v << ")" << endl; }
private:
    int v;
};
 
class BaseWrong
{
public:
    BaseWrong(int v) : v(v) { cout << "BaseWrong constructor (" << v << ")" << endl; }
    ~BaseWrong() { cout << "BaseWrong destructor (" << v << ")" << endl; }
protected:
    int v;
};
 
class BaseCorrect
{
public:
    BaseCorrect(int v) : v(v) { cout << "BaseCorrect constructor (" << v << ")" << endl; }
    virtual ~BaseCorrect() { cout << "BaseCorrect destructor (" << v << ")" << endl; }
protected:
    int v;
};
 
class DerivWrong : public BaseWrong
{
public:
    DerivWrong(int v) : BaseWrong(v), m(v) { cout << "DerivWrong constructor (" << v << ")" << endl; }
    ~DerivWrong() { cout << "DerivWrong destructor (" << v << ")" << endl; }
private:
    Member m;
};
 
class DerivCorrect : public BaseCorrect
{
public:
    DerivCorrect(int v) : BaseCorrect(v), m(v) { cout << "DerivCorrect constructor (" << v << ")" << endl; }
    ~DerivCorrect() { cout << "DerivCorrect destructor (" << v << ")" << endl; }
private:
    Member m;
};
 
int main()
{
    DerivWrong d1(1);
    DerivCorrect d2(2);
    BaseWrong *pd3 = new DerivWrong(3);
    BaseCorrect *pd4 = new DerivCorrect(4);
    delete pd3;
    delete pd4;
 
    return 0;
}
http://liveworkspace.org/code/84ad0e01f3fd18f6a680b1c81cf58f01
0
ValeryS
Модератор
7272 / 5526 / 692
Регистрация: 14.02.2011
Сообщений: 18,725
11.08.2012, 21:07 19
Я дико извиняусьпока я дошел до дому(читай другой кампупер) тут такого понаписали
пример
C++
1
2
3
4
5
6
7
8
9
class b
{
public:
  b{ int* x=new int[6];} 
 
~b() {delete[]x;}
 ..............
}
 b d=b();
понятно для чего нужно писать конструктор копий (а так же равно?)или объяснить???
Цитата Сообщение от Avazart Посмотреть сообщение
Думаю нет...
Че чесно?
0
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
11.08.2012, 21:27 20
Цитата Сообщение от ValeryS Посмотреть сообщение
понятно для чего нужно писать конструктор копий (а так же равно?)или объяснить???
Вопрос-то наоборот ставился: будет ли ошибкой всегда создавать свой конструктор копирования, даже в тех случаях, когда динамического выделения ресурсов нет (то есть когда компилятор создаёт приемлемый вариант).
0
11.08.2012, 21:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2012, 21:27

Вызов конструктора копий
Всех приветствую! Имеется следующий простенький код: #include &lt;iostream&gt; ...

Вызов конструктора копий
Почему из строк 186-191 вызывается конструктор копий 83-91? #include...

Классы: конструктор копий
Создать конструктор копий и оператор присваивания для класса компьютер и члена...


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

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

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