Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Rukov
1 / 1 / 0
Регистрация: 24.01.2017
Сообщений: 78
Завершенные тесты: 1
1

Конструктор копирования

16.09.2017, 21:12. Просмотров 286. Ответов 9
Метки нет (Все метки)

Почему экземпляры класса копируются без конструктора копий ?
и к тому же получили разные адреса ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
=====array2.h.cpp=======
……..
===== array2.cpp=======
………
=====Main.cpp=======
int main() { 
array2 m1(a,b); 
m1.ReadMas();
 
array2 m2(c,d); 
m2.ReadMas();
 
m2 = m1;    
m2.WriteMas();
 
array2 m3(m1);
m3.WriteMas();
…….
return 0
}
==============================
... сам же конструктор не включен в код и выглядит следующим образом
(возможно ошибка, - т.к. при нем запускается но не работает копирование
например тот же код выше
C++
1
2
array2 m3(m1);
m3.WriteMas();
)
==============================
C++
1
2
3
4
5
6
7
8
9
10
11
//// конструктор копии...
array2::array2(const array2& m2){
 array2 *p;
    p = new array2(m2.n, m2.m);
for(int i=0;i<n;i++){ 
for(int j=0;j<m;j++){
     p->mas[i][j]= m2.mas[i][j];
}
}
  
}
0
Миниатюры
Конструктор копирования  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2017, 21:12
Ответы с готовыми решениями:

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве...

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) {...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три:...

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и...

9
DrOffset
8130 / 4713 / 1152
Регистрация: 30.01.2014
Сообщений: 7,681
17.09.2017, 00:10 2
Rukov, Конструктор копирования и оператор присваивания компилятор создает по умолчанию, если программист их не описал. Конструктор копирования по умолчанию выполняет почленное копирование данных класса. Если у тебя там указатели внутри (судя по коду так и есть), то скопируются только они (адреса в них содержащиеся), а не данные на которые они указывают.

Цитата Сообщение от Rukov Посмотреть сообщение
возможно ошибка,
Ошибка точно, причем совершенно дикая. Как рука повернулась такое написать?

Цитата Сообщение от Rukov Посмотреть сообщение
и к тому же получили разные адреса ?
Разные адреса у стековых объектов - это естественно. А вот указатели, которые в этих объектах содержаться, при реализации конструктора копирования по умолчанию будут содержать одинаковые адреса, что в данном случае является грубой ошибкой, т.к. провоцирует двойное освобождение памяти в деструкторах исходного объект и скопированного.
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,045
17.09.2017, 00:12 3
Цитата Сообщение от Rukov Посмотреть сообщение
Почему экземпляры класса копируются без конструктора копий ?
Если не определён явный конструктор копирования, работает конструктор копирования по умолчанию.
1
DrOffset
8130 / 4713 / 1152
Регистрация: 30.01.2014
Сообщений: 7,681
17.09.2017, 00:13 4
Rukov, Вот здесь человек писал подобный класс, а я исправил кое-какие ошибки. Думаю не лишним будет ознакомиться: Создать копирующий конструктор для класса матрицы и перегрузить оператор <<
1
Rukov
1 / 1 / 0
Регистрация: 24.01.2017
Сообщений: 78
Завершенные тесты: 1
17.09.2017, 21:10  [ТС] 5
Цитата Сообщение от DrOffset Посмотреть сообщение
А вот указатели, которые в этих объектах
Т.е. адреса из этого кода неотражают реальную картину ?
но там присутствует поле указатель...**mas

тогда что строки 29-30; 41-42 неправильно отображают различные адреса ?








C++
1
2
3
4
5
6
class array2
{ 
 int **mas; 
 int n; 
 int m;
public:
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
case 52:  
{
cout<< "Выбран пункт №4";
 
cout<< "\n\n Введите размерность массива 1:\n"<< endl;
cout << " Количество строк    --> "; cin >> a;
cout << " Количество столбцов --> "; cin >> b;
array2 m1(a,b); 
m1.ReadMas();
 
cout<< "\n\n Введите размерность массива 2:\n"<< endl;
cout << " Количество строк    --> "; cin >> c;
cout << " Количество столбцов --> "; cin >> d;
array2 m2(a,b); 
m2.ReadMas();
 
//array2 *p1,*p2,*p3;
 
cout << "Используем конструктор копирования\n";
cout << " array2 m3(m1)\n";
 
array2 m3(m1);
m3.WriteMas();
 
array2 *p1, *p2, *p3, *p4;
p1 = &m3;
p2 = &m1;
cout <<" Адреса: \n";
cout << hex << "&m3=  "<< &p1 <<endl;
cout << hex << "&m1=  "<< &p2<<endl;
cout << "------------------"<<endl;
_getch();         
 
cout << "array2 m5 = m1;\n";
array2 m5=m1;
m5.WriteMas();
 
p1 = NULL; p2 = p1;
p1 = &m5; p2 = &m1;
cout <<" Адреса: \n";
cout << hex << "&m5=  "<< &p3 <<endl;
cout << hex << "&m1=  "<< &p4<<endl;
 
_getch();
//break;  //н
 
 
cout << "array2 m6 = m1+m2+m2-m1;\n";
array2 m6=m1+m2+m3-m1;
m6.WriteMas();
 
}
_getch();
break;
0
Миниатюры
Конструктор копирования  
Rukov
1 / 1 / 0
Регистрация: 24.01.2017
Сообщений: 78
Завершенные тесты: 1
17.09.2017, 21:18  [ТС] 6
Цитата Сообщение от nd2 Посмотреть сообщение
Если не определён явный конструктор копирования
...копирование не идет...и умножение матриц...
0
Вложения
Тип файла: rar Матрица_Я.rar (4.0 Кб, 1 просмотров)
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,045
17.09.2017, 21:31 7
Цитата Сообщение от Rukov Посмотреть сообщение
...копирование не идет...и умножение матриц...
Рзз у тебя в классе указатель, то должен быть определён явный конструктор копирования, оператор присваивания и деструктор (правило трёх).

Добавлено через 5 минут
Без этого будет копироваться просто значение указателя, а не данные по адресу в указателе.
1
DrOffset
8130 / 4713 / 1152
Регистрация: 30.01.2014
Сообщений: 7,681
17.09.2017, 22:14 8
Цитата Сообщение от Rukov Посмотреть сообщение
тогда что строки 29-30; 41-42 неправильно отображают различные адреса ?
Правильно.
Это разные объекты и логично, что у них разные адреса.
Не надо путать адрес объекта array2 и адрес, который хранится внутри него в качестве члена-данных.

Добавлено через 51 секунду
Цитата Сообщение от Rukov Посмотреть сообщение
но там присутствует поле указатель...**mas
Ну вот его значение и надо выводить, чтобы эту картину увидеть.
1
Rukov
1 / 1 / 0
Регистрация: 24.01.2017
Сообщений: 78
Завершенные тесты: 1
18.09.2017, 17:50  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну вот его значение и надо выводить
Вывел двумя способами...но не уверен...так ли ?

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
cout << "Используем конструктор копирования\n";
cout << " array2 m3(m1)\n";
 
array2 m3(m1);
m3.WriteMas();
 
array2 *p1, *p2;//,*p3,*p4;
p1 = &m3;
p2 = &m1;
 
cout <<" Адреса: \n";
cout << hex << "&m3=  "<< &p1 <<endl;
cout << hex << "&m1=  "<< &p2<<endl;
cout << "------------------"<<endl;
 
p1+=8;
p2+= 8;
cout <<" Адреса: \n";
cout << hex << "&m3.mas+8 =  "<< &p1 <<endl;
cout << hex << "&m1.mas+8 =  "<< &p2<<endl;
_getch();
//break;  //н
 
cout << "array2 m5 = m1;\n";
array2 m5=m1;
m5.WriteMas();
//p1 = NULL; p2 = p1;
//p1 = &m5; p2 = &m1;
int ***p3, ***p4;
p3 = &m5.mas;
p4 = &m1.mas;
 
cout <<" \nАдреса: \n";
cout << hex << "&m5.mas = "<<  &p3 <<endl;
cout << hex << "&m1.mas =  "<< &p4<<endl;
 
_getch();
break;  //н
 
cout << "array2 m6 = m1+m2+m2-m1;\n";
array2 m6=m1+m2+m3-m1;
m6.WriteMas();
 
}
0
Миниатюры
Конструктор копирования  
Rukov
1 / 1 / 0
Регистрация: 24.01.2017
Сообщений: 78
Завершенные тесты: 1
18.09.2017, 18:01  [ТС] 10
Цитата Сообщение от Rukov Посмотреть сообщение
cout << hex << "&m3.mas+8 = "<< &p1 <<endl; cout << hex << "&m1.mas+8 = "<< &p2<<endl;
стр19-20... в тексте опечатка...нада
19 cout << hex << "&m3+8 = "<< &p1 <<endl;
20 cout << hex << "&m1+8 = "<< &p2<<endl;
0
18.09.2017, 18:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2017, 18:01

Конструктор копирования
Ребята!! Вроде все получается, да только вот сделала конструктор копирования (А...

С++: new и конструктор копирования
Пусть есть класс Example (с конструктором копирования). Example *e1; e1 =...

Конструктор копирования
Помогите пожалуйста разобраться, необходимо добавить конструктор копирования,...


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

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

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