Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2012, 15:56
Ответы с готовыми решениями:

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

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

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

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

22
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 16:00 2
Цитата Сообщение от DaskOFF Посмотреть сообщение
правильно ли я понял задание
Да
Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Нет. Всего лишь мартышкин труд.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.08.2012, 16:02 3
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Думаю нет...
Но зачем? Думаю это только будит сбивать с толку людей читающих ваш код...

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

Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Это не будет ошибкой (при условии, что реализован он правильно). Но при добавлении членов к классу придётся не забывать обновлять конструктор копий, иначе часть членов не будет копироваться.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
11.08.2012, 16:05 5
Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
если работаешь с памятью то создавать надо
1
113 / 113 / 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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2012, 16:30 8
Avazart, Не сказал бы, что это так уж полезно.) Нужно прописывать деструктор, если есть что уничтожать или же класс подразумевается как базовый для некоторого другого.
2
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.08.2012, 17:00 9
Avazart, Не сказал бы, что это так уж полезно.) Нужно прописывать деструктор, если есть что уничтожать или же класс подразумевается как базовый для некоторого другого.
Утечка памяти (Expression: _CrtIsValidHeapPointer(pUserData))
1
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.08.2012, 17:26 10
Avazart, там беда в отсутствии именно виртуального деструктора. Да, если есть хотя бы небольшой шанс, что класс будет базовым и использоваться полиморфно, то деструктор обязательно надо создавать. Но не для того, чтобы просто его создать, а для того, чтобы сделать его виртуальным.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.08.2012, 18:02 11
Упустил момент...
Ну а если не объявить вообще в наследуемом классе, то что будет,или что страшного может быть?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.08.2012, 18:05 12
В наследниках можно не объявлять, если деструктор ничего не делает. Отменить виртуальность деструктора не удастся.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.08.2012, 18:06 13
Я имею ввиду в базовом...
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.08.2012, 18:12 14
Если в базовом деструктор отсутствует, то при неполиморфном использовании ничего плохого не случиться. Но если объект потомка будет удаляться через указатель на базовый класс (то есть полиморфно), то при отсутствии виртуального деструктора в базовом классе будет вызван деструктор именно базового класса (такой вот парадокс), а деструктор потомка вызван не будет. Отсюда возможная утечка ресурсов, выделенных в конструкторе потомка.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.08.2012, 18:28 15
Отсюда возможная утечка ресурсов
Даже если обоих классах отстутствуют динамически созданные объекты ?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.08.2012, 18:35 16
Цитата Сообщение от Avazart Посмотреть сообщение
Даже если обоих классах отстутствуют динамически созданные объекты ?
В принципе да. Если память динамически выделяют объекты, которые являются членами класса-потомка. Раз деструктор потомка не вызывается, то и его члены не будут разрушены (для них тоже не будут вызваны деструкторы).

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

Добавлено через 44 секунды
Правда теперь я углубился в теорию, пойду проверю на практике
напиши потом что получится, я как раз к деструкторам перехожу
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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/... c81cf58f01
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.08.2012, 21:27 20
Цитата Сообщение от ValeryS Посмотреть сообщение
понятно для чего нужно писать конструктор копий (а так же равно?)или объяснить???
Вопрос-то наоборот ставился: будет ли ошибкой всегда создавать свой конструктор копирования, даже в тех случаях, когда динамического выделения ресурсов нет (то есть когда компилятор создаёт приемлемый вариант).
0
11.08.2012, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2012, 21:27
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru