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

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

Войти
Регистрация
Восстановить пароль
 
RAFA91
Заблокирован
#1

Стандартный конструктор копировщик и оператор = не справляются со своей задачей - C++

11.07.2015, 15:57. Просмотров 236. Ответов 2
Метки нет (Все метки)

Всем привет !

Выяснил , что стандартный конструктор копировщик и оператор = не справляются со своей задачей в случае,

если значение переменной класса находится в области динамического обмена.

После выполнения
C++
1
A = B;
значение указателей x обьекта А и В совпадают.

После выполнения
C++
1
Vita D(987), C(D);
значение указателей x обьекта C и D совпадают.

Не понял также почему в функции void hgh(int a) я могу изменять значения переменной.

я же возле нее поставил слово const.

Для меня это загадка.

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
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <conio.h>
 
class Vita
 
{
 
private:
 
    int *x;
 
public:
 
    Vita() : x(new int(0)) {printf("\nKONSTRUKTOR 1 %p x = %p\n",this,x);}
 
    Vita(int a) : x(new int(a)) {printf("\nKONSTRUKTOR 2 %p x = %p\n",this,x);}
 
    ~Vita() 
    
    {
        printf("\nDESTRUKTOR %p x = %p\n",this,x);
 
        delete x;
    }
 
    int fvf() const {printf("\nfvf() %p x = %p\n",this,x); return *x;}
 
    void hgh(int a) const {printf("\nfvf() %p x = %p\n",this,x); *x = a;}
};
 
 
int main()
 
{
    Vita A(600);
 
    printf("\nA = %p\n",&A);
 
    printf("\nA = %d\n",A.fvf());
 
    Vita B(700);
 
    printf("\nB = %p\n",&B);
 
    printf("\nB = %d\n",B.fvf());
 
    A = B;
 
    printf("\nA = %d\n",A.fvf());
 
    A.hgh(123);
 
    printf("\nA = %d\n",A.fvf());
 
    printf("\nB = %d\n",B.fvf());
 
    printf("\n*****************************\n");
 
    Vita D(987), C(D);
 
    printf("\nC = %p D = %p\n",&C,&D);
 
    printf("\nC = %d D = %d\n",C.fvf(),D.fvf());
 
    getch();
 
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2015, 15:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стандартный конструктор копировщик и оператор = не справляются со своей задачей (C++):

Конструктор-копировщик - C++
Matrix::Matrix(const Matrix &amp; rhs) { itsNumOfStr = rhs.itsNumOfStr; itsNumOfCol = rhs.itsNumOfCol; //cout &lt;&lt; &quot;CONTRRRRRRRR\n&quot;; ...

Конструктор-копировщик - C++
Доброго времени суток! Сейчас изучаю класы, и столкнулся с такой проблемой. Компилятор отказывается понимать те функции-члены, в которых...

Конструктор копировщик - C++
Самостоятельно изучаю С++ по Либерти(освой за 21 день) Требуется создать класс и конструктор копировщик. Компилятор Visual C++ 2010. ...

Виртуальный конструктор копировщик. - C++
Добрый вечер . Объясните для чего в природе может быть использован виртуальный конструктор копировщик ? виртуальная функция существует для...

Конструктор - копировщик: ошибка - C++
при таком кодеclass cat{ public: cat(); ~cat(); cat(cat&amp;); }; cat::cat(){ cout&lt;&lt;&quot;Cat constructor&quot;&lt;&lt;endl; ...

конструктор копировщик-смысл? - C++
объясните пожалуйста для чего нужен конструктор копировщик... в С++ за 21 день страница 248

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
11.07.2015, 17:51 #2
По поводу копирования и присваивания - не понял, в чём вопрос. Да, копируются указатели. Если надо по-другому, пиши свои конструктор копирования и оператор присваивания.
В hgh изменяется *x, сам x не изменяется.
0
RAFA91
Заблокирован
12.07.2015, 14:14  [ТС] #3
Цитата Сообщение от Somebody Посмотреть сообщение
По поводу копирования и присваивания - не понял, в чём вопрос.
суть в том , что стандартный копировщик и оператор присвоения делают утечку памяти в динамической памяти.

пусть конструктор обьекта А присвоил переменной х адрес х1, а конструктор обьекта В присвоил переменной х адрес х2.

после выполнения операции присвоения A = B; адрес переменой х обьекта А стал равняться х2, при этом адрес х1 уплыл в некуда .

при копировании происходит аналогичная аномалия указателей.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2015, 14:14
Привет! Вот еще темы с ответами:

Конструктор копировщик объектов, содержащих массивы - C++
Конструктор копировщик который будет создавать объекты в которых есть массивы. Можно просто фрагмент кода.

[C++] В чём тут ошибка? (делаю конструктор-копировщик) - C++
Пытаюсь написать класс с конструктором-копировщиком.В чём тут ошибка? class Subroutine { public: Subroutine (){}; ...

Параметр rhs, что это и для чего (конструктор-копировщик) - C++
Вот код: #include &lt;iostream&gt; class jurnal { public: jurnal() { }

Стандартный конструктор у union? - C++
Не могу сообразить в чем проблема struct Foo { union { struct {float x,y,z;} v; struct { ...


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

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

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