С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
#1

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

11.08.2012, 15:56. Просмотров 928. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос конструкторы копий (C++):

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

констр. копий - C++
#include <conio.h> #include <iostream> using namespace std; class A { int *mas; int size; public: A(int size1) ...

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

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

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

Вызов конструктора копий - C++
Всех приветствую! Имеется следующий простенький код: #include <iostream> using namespace std; class Object { ...

22
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.08.2012, 16:00 #2
Цитата Сообщение от DaskOFF Посмотреть сообщение
правильно ли я понял задание
Да
Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Нет. Всего лишь мартышкин труд.
1
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
11.08.2012, 16:02 #3
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Думаю нет...
Но зачем? Думаю это только будит сбивать с толку людей читающих ваш код...

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

Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
Это не будет ошибкой (при условии, что реализован он правильно). Но при добавлении членов к классу придётся не забывать обновлять конструктор копий, иначе часть членов не будет копироваться.
1
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,250
11.08.2012, 16:05 #5
Цитата Сообщение от DaskOFF Посмотреть сообщение
Грубой ли ошибкой будет всегда создавать конструктор копий не надеясь на синтезируемый конструктор?
если работаешь с памятью то создавать надо
1
DaskOFF
112 / 112 / 9
Регистрация: 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
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.08.2012, 16:30 #8
Avazart, Не сказал бы, что это так уж полезно.) Нужно прописывать деструктор, если есть что уничтожать или же класс подразумевается как базовый для некоторого другого.
2
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
11.08.2012, 17:00 #9
Avazart, Не сказал бы, что это так уж полезно.) Нужно прописывать деструктор, если есть что уничтожать или же класс подразумевается как базовый для некоторого другого.
Утечка памяти (Expression: _CrtIsValidHeapPointer(pUserData))
1
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
11.08.2012, 17:26 #10
Avazart, там беда в отсутствии именно виртуального деструктора. Да, если есть хотя бы небольшой шанс, что класс будет базовым и использоваться полиморфно, то деструктор обязательно надо создавать. Но не для того, чтобы просто его создать, а для того, чтобы сделать его виртуальным.
1
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
11.08.2012, 18:02 #11
Упустил момент...
Ну а если не объявить вообще в наследуемом классе, то что будет,или что страшного может быть?
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
11.08.2012, 18:05 #12
В наследниках можно не объявлять, если деструктор ничего не делает. Отменить виртуальность деструктора не удастся.
0
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
11.08.2012, 18:06 #13
Я имею ввиду в базовом...
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
11.08.2012, 18:12 #14
Если в базовом деструктор отсутствует, то при неполиморфном использовании ничего плохого не случиться. Но если объект потомка будет удаляться через указатель на базовый класс (то есть полиморфно), то при отсутствии виртуального деструктора в базовом классе будет вызван деструктор именно базового класса (такой вот парадокс), а деструктор потомка вызван не будет. Отсюда возможная утечка ресурсов, выделенных в конструкторе потомка.
1
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
11.08.2012, 18:28 #15
Отсюда возможная утечка ресурсов
Даже если обоих классах отстутствуют динамически созданные объекты ?
0
11.08.2012, 18:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2012, 18:28
Привет! Вот еще темы с ответами:

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

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

Что такое конструктор копий? - C++
Объясните, пожалуйста, на максимально простом языке, чем отличается конструктор от конструктора копий? Может это и одно и то же, хотя...

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


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

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

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