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

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

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

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

11.07.2015, 15:57. Просмотров 222. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2015, 15:57     Стандартный конструктор копировщик и оператор = не справляются со своей задачей
Посмотрите здесь:

C++ [C++] В чём тут ошибка? (делаю конструктор-копировщик)
C++ конструктор копировщик-смысл?
Конструктор - копировщик: ошибка C++
Конструктор-копировщик C++
Конструктор копировщик C++
C++ Виртуальный конструктор копировщик.
Параметр rhs, что это и для чего (конструктор-копировщик) C++
C++ Конструктор-копировщик
C++ Приватный конструктор и стандартный контейнер. Два барана на мосту
C++ оператор = и конструктор копирования
C++ Конструктор и оператор new
Конструктор копировщик объектов, содержащих массивы C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
11.07.2015, 17:51     Стандартный конструктор копировщик и оператор = не справляются со своей задачей #2
По поводу копирования и присваивания - не понял, в чём вопрос. Да, копируются указатели. Если надо по-другому, пиши свои конструктор копирования и оператор присваивания.
В hgh изменяется *x, сам x не изменяется.
RAFA91
Заблокирован
12.07.2015, 14:14  [ТС]     Стандартный конструктор копировщик и оператор = не справляются со своей задачей #3
Цитата Сообщение от Somebody Посмотреть сообщение
По поводу копирования и присваивания - не понял, в чём вопрос.
суть в том , что стандартный копировщик и оператор присвоения делают утечку памяти в динамической памяти.

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

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

при копировании происходит аналогичная аномалия указателей.
Yandex
Объявления
12.07.2015, 14:14     Стандартный конструктор копировщик и оператор = не справляются со своей задачей
Ответ Создать тему
Опции темы

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