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

конструкторы копий - C++

Восстановить пароль Регистрация
 
 
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
11.08.2012, 15:56     конструкторы копий #1
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)Прочитал по поводу конструктора копий, и тут затрагивался синтезируемый конструктор копий.
Как тут написано
В большинстве случаев синтезируемый конструктор копий осуществляет именно те действия, которые необходимы.
если не используются указатели.
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2012, 15:56     конструкторы копий
Посмотрите здесь:

C++ Конструктор копий по умолчанию.
C++ констр. копий
C++ [C++] классы конструктор копий
C++ Что такое конструктор копий?
C++ Конструктор копий
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 16:00     конструкторы копий #2
Цитата Сообщение от DaskOFF Посмотреть сообщение
правильно ли я понял задание
Да
Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Нет. Всего лишь мартышкин труд.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
11.08.2012, 16:02     конструкторы копий #3
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Думаю нет...
Но зачем? Думаю это только будит сбивать с толку людей читающих ваш код...

Говорят полезно всегда прописывать деструктор даже, если нет динамических объектов внутри класса.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 16:04     конструкторы копий #4
Цитата Сообщение от DaskOFF Посмотреть сообщение
правильно ли я понял задание
Задание понял правильно, а реализация содержит ошибку. Объект *psting не был создан, а в него производится присваивание.

Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Это не будет ошибкой (при условии, что реализован он правильно). Но при добавлении членов к классу придётся не забывать обновлять конструктор копий, иначе часть членов не будет копироваться.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
11.08.2012, 16:05     конструкторы копий #5
Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
если работаешь с памятью то создавать надо
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 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); }
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
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)) {}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.08.2012, 16:30     конструкторы копий #8
Avazart, Не сказал бы, что это так уж полезно.) Нужно прописывать деструктор, если есть что уничтожать или же класс подразумевается как базовый для некоторого другого.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
11.08.2012, 17:00     конструкторы копий #9
Avazart, Не сказал бы, что это так уж полезно.) Нужно прописывать деструктор, если есть что уничтожать или же класс подразумевается как базовый для некоторого другого.
Утечка памяти (Expression: _CrtIsValidHeapPointer(pUserData))
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 17:26     конструкторы копий #10
Avazart, там беда в отсутствии именно виртуального деструктора. Да, если есть хотя бы небольшой шанс, что класс будет базовым и использоваться полиморфно, то деструктор обязательно надо создавать. Но не для того, чтобы просто его создать, а для того, чтобы сделать его виртуальным.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
11.08.2012, 18:02     конструкторы копий #11
Упустил момент...
Ну а если не объявить вообще в наследуемом классе, то что будет,или что страшного может быть?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 18:05     конструкторы копий #12
В наследниках можно не объявлять, если деструктор ничего не делает. Отменить виртуальность деструктора не удастся.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
11.08.2012, 18:06     конструкторы копий #13
Я имею ввиду в базовом...
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 18:12     конструкторы копий #14
Если в базовом деструктор отсутствует, то при неполиморфном использовании ничего плохого не случиться. Но если объект потомка будет удаляться через указатель на базовый класс (то есть полиморфно), то при отсутствии виртуального деструктора в базовом классе будет вызван деструктор именно базового класса (такой вот парадокс), а деструктор потомка вызван не будет. Отсюда возможная утечка ресурсов, выделенных в конструкторе потомка.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
11.08.2012, 18:28     конструкторы копий #15
Отсюда возможная утечка ресурсов
Даже если обоих классах отстутствуют динамически созданные объекты ?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 18:35     конструкторы копий #16
Цитата Сообщение от Avazart Посмотреть сообщение
Даже если обоих классах отстутствуют динамически созданные объекты ?
В принципе да. Если память динамически выделяют объекты, которые являются членами класса-потомка. Раз деструктор потомка не вызывается, то и его члены не будут разрушены (для них тоже не будут вызваны деструкторы).

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

Добавлено через 44 секунды
Правда теперь я углубился в теорию, пойду проверю на практике
напиши потом что получится, я как раз к деструкторам перехожу
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
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/84ad0e...80b1c81cf58f01
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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 Посмотреть сообщение
Думаю нет...
Че чесно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2012, 21:27     конструкторы копий
Еще ссылки по теме:

C++ Вызов конструктора копий
Конструктор копий C++
C++ Вызов конструктора копий

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 21:27     конструкторы копий #20
Цитата Сообщение от ValeryS Посмотреть сообщение
понятно для чего нужно писать конструктор копий (а так же равно?)или объяснить???
Вопрос-то наоборот ставился: будет ли ошибкой всегда создавать свой конструктор копирования, даже в тех случаях, когда динамического выделения ресурсов нет (то есть когда компилятор создаёт приемлемый вариант).
Yandex
Объявления
11.08.2012, 21:27     конструкторы копий
Ответ Создать тему
Опции темы

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