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

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

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

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

11.08.2012, 15:56. Просмотров 932. Ответов 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
grizlik78
Эксперт С++
1974 / 1467 / 122
Регистрация: 29.05.2011
Сообщений: 3,037
11.08.2012, 18:35 #16
Цитата Сообщение от Avazart Посмотреть сообщение
Даже если обоих классах отстутствуют динамически созданные объекты ?
В принципе да. Если память динамически выделяют объекты, которые являются членами класса-потомка. Раз деструктор потомка не вызывается, то и его члены не будут разрушены (для них тоже не будут вызваны деструкторы).

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

Добавлено через 44 секунды
Правда теперь я углубился в теорию, пойду проверю на практике
напиши потом что получится, я как раз к деструкторам перехожу
0
grizlik78
Эксперт С++
1974 / 1467 / 122
Регистрация: 29.05.2011
Сообщений: 3,037
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
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,452
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
Эксперт С++
1974 / 1467 / 122
Регистрация: 29.05.2011
Сообщений: 3,037
11.08.2012, 21:27 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
понятно для чего нужно писать конструктор копий (а так же равно?)или объяснить???
Вопрос-то наоборот ставился: будет ли ошибкой всегда создавать свой конструктор копирования, даже в тех случаях, когда динамического выделения ресурсов нет (то есть когда компилятор создаёт приемлемый вариант).
0
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,452
11.08.2012, 21:39 #21
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вопрос-то наоборот ставился: будет ли ошибкой всегда создавать свой конструктор копирования, даже в тех случаях, когда динамического выделения ресурсов нет
тыды не надо
Цитата Сообщение от grizlik78 Посмотреть сообщение
(то есть когда компилятор создаёт приемлемый вариант).
А Вы часто смотрите ассеблерный листинг???
если нет откуда Вы знаете
Цитата Сообщение от grizlik78 Посмотреть сообщение
(то есть когда компилятор создаёт приемлемый вариант).
0
grizlik78
Эксперт С++
1974 / 1467 / 122
Регистрация: 29.05.2011
Сообщений: 3,037
11.08.2012, 21:41 #22
Время от времени смотрю и листинг. Но не в таких случаях. С чего бы мне не доверять компилятору выполнять копирование, если нет указателей? Вот самому-то как раз больше возможностей ошибку совершить.
0
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,452
11.08.2012, 21:55 #23
Цитата Сообщение от grizlik78 Посмотреть сообщение
С чего бы мне не доверять компилятору
да потому что врет собака
за винду не скажу, а микроконтролеры раз да через раз
привести сумму к инту и делить на 2(среднне арифметическое) такое вытворяет
Цитата Сообщение от grizlik78 Посмотреть сообщение
Время от времени смотрю и листинг.
Это правильно, доверяй но проверяй
спросят с тебя, а не с компилятора

Добавлено через 3 минуты
grizlik78,
извиниза прежний пост
думал ТС отвечал
0
11.08.2012, 21:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2012, 21:55
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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