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

что делает copy constructor? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Реализовать классы для структур данных «стек» и «очередь» http://www.cyberforum.ru/cpp-beginners/thread881923.html
дали такое задание, не понимаю что делать.. Реализовать классы для структур данных «стек» и «очередь». Следует реализовать абстрактный базовый класс, по возможности реализовав часть общих, похожих функций в нём. Над радиодеталями должны быть доступны следующие операции: сохранение в массив байт (бинарный, не текстовый), восстановление из ранее сохранённого буфера, добавление элемента,...
C++ Объясните программу на С++ http://www.cyberforum.ru/cpp-beginners/thread209118.html взял отсюда #include <iostream.h> #include <math.h> #include <windows.h> char FileName; char Stroka; http://www.cyberforum.ru/cpp-beginners/thread881915.html
C++ Составить код программы и блок-схему (построить график функции у=2*sin x*e4/5 на заданном интервале)
Разработать программу для построения графика функции у=2*sin x*e4/5. Считать из файла х функции. График функции построить в интервале от -50 до 50. ПОМОГИТЕЕ)))
C++ Составить программу, которая по введенному номеру месяца определяет время года
Составить программу, которая по введенному номеру месяца определяет время года, например, ввели 5 – весна .Напишите подробно.очень Вас прошу. Создавайте темы с осмысленными и понятными названиями!
C++ Найти среднее арифметическое отрицательных элементов массива, предшествующих первому положительному элементу; проверить, упорядочены ли элементы по во http://www.cyberforum.ru/cpp-beginners/thread881895.html
Помогите, пожалуйста! Сегодня зачет, а у меня ноут полетел!! нужен такой код до трех часов: 1)Найти среднее арифметическое отрицательных элементов массива, предшествующих первому положительному элементу. Если по какой-либо причине вычислить среднее арифметическое не удается, выдать об этом сообщение с указанием причины. 2)Проверить, упорядочены ли элементы по возрастанию.
C++ Удаление столбца из двумерного массива Не могу решить, помогите: Дан двумерный массив 7x9 удалить столбцы, в которых присутствует хотя бы одно положительное число. подробнее

Показать сообщение отдельно
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
28.05.2013, 15:06     что делает copy constructor?
Как уже было сказано конструктор копировщик создан для копирования объектов.

Как и конструктор, деструктор по умолчанию, так же у тебя есть и конструктор копировщик по умолчанию, т.е. если ты его не задал, то он все равно есть, его задает компилятор.

Вот демонстрация ошибки конструктора копировщика по умолчанию, она возникает когда в качестве переменных класса используются указатели, в частности int *cena;

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class car
{
public:
car() { cena = new int; }
~car() { delete cena; }
 
void set(int x) { *cena = x; }
int get() { return *cena; }
 
 
private:
int *cena;
};
 
int main()
{
 
car vaz;
vaz.set(100);
 
std::cout << "cena vaza: " << vaz.get() << "\n";
 
car gaz(vaz);
gaz.set(150);
std::cout << "cena gaza: " << gaz.get() << "\n";
std::cout << "cena vaza: " << vaz.get() << "\n";
 
 
system("pause");
return 0;
}


В строчке 20 мы объявляем объект vaz, присваиваем ему цену в строчке 21, т.е. *cena объекта vaz получает ячейку в памяти, допустим ее адрес 00001, и по этому адресу располагается значение 100.
В строчке 25 мы объявляем новый объект - gaz и присваиваем ему все параметры объекта vaz, в частности цена vaz тоже составляет 100, в следующей строчке мы меняем цену на 150.
НО, по мимо цены gaz поменялась цена и vaz, она теперь составляет 150, почему так? потому что *cena объекта vaz и *cena объекта gaz находятся по одному адресу - 00001.
В итоге программа работает не правильно.

Что бы такого не было надо использовать собственный копировщик, вот он:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class car
{
public:
car() { cena = new int; }
~car() { delete cena; }
 
car(car &r) { cena = new int; *cena = r.get(); }
 
void set(int x) { *cena = x; }
int get() { return *cena; }
 
 
private:
int *cena;
};
 
int main()
{
 
car vaz;
vaz.set(100);
 
std::cout << "cena vaza: " << vaz.get() << "\n";
 
car gaz(vaz);
gaz.set(150);
std::cout << "cena gaza: " << gaz.get() << "\n";
std::cout << "cena vaza: " << vaz.get() << "\n";
 
 
system("pause");
return 0;
}


добавлен копировщик в строке 9, который при копировании выделяет для цены (*cena) нового объекта, отдельную ячейку в памяти.

т.е. теперь *cena объекта vaz располагается по адресу 00001, а *cena объекта gaz располагается по адресу 00002
Программа работает верно.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru