ForEveR, я вроде понял. сейчас попробую дописать и сравнить результаты.
Добавлено через 1 час 51 минуту
добавил конструктор копирования.
C++ |
1
2
3
4
5
6
7
8
9
10
11
| ...
Test(const Test &);
...
Test::Test(const int &value) : size(value){
this->data = new int[size];
for(int i = 0; i < size; ++i){
this->data[i] = i;
}
}
.... |
|
Количество вызовов дестурктора в обоих случаях не изменилось. (я полагаю и не должно было).
Переформулирую вопрос.
Если я использую диструктор такого вида:
C++ |
1
2
3
| Test::~Test(){
delete [] this->data;
} |
|
и хочу после выполнения умножения "присвоить" результат другому объекту типа Test
то как я понимаю наличие перегруженного оператора присвоения обязательно, потому что например в таком случае
сначала вызовется перегруженный оператор умножения который вернет объект типа Test содержащий результат вычислений. после чего будет вызван деструктор который освободит память созданного в операторе умножения объекта
и только потом объекту
s будет предпринята попытка присвоить адрес объекта возвращаемого перегруженным оператором умножения, а этот объект уже фактически не существует. Результат в
s будет мусор.
Теперь я перегрузил оператор присвоения.
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
....
Test &operator=(const Test &);
.....
Test &Test::operator=(const Test &right){
if(this != &right){
if(this->size!=right.size){
delete [] this->data;
this->size = right.size;
this->data = new int[right.size];
}
for(int i = 0; i < size; ++i){
this->data[i] = right.data[i];
}
}
return *this;
} |
|
Мой ход мыслей верен ?
Я запускал дебаг в eclipse. прошел пошагово по всему коду и у меня
ни разу не был вызван конструктор копирования.... непоняяяятно
(простите за много букв

)
КОД В ИТОГЕ
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
69
70
71
72
73
| #include <iostream>
class Test{
public:
Test(const int &);
Test(const Test &);
~Test();
Test operator*(const int &);
Test &operator=(const Test &);
int size;
int *data;
};
Test::Test(const int &value) : size(value){
this->data = new int[size];
for(int i = 0; i < size; ++i){
this->data[i] = i;
}
}
Test::Test(const Test &right) : size(right.size){
this->data = new int[right.size];
for(int i = 0; i < this->size; ++i){
this->data[i] = right.data[i];
}
}
Test Test::operator*(const int &right){
Test temp(this->size);
for(int i = 0; i < size; ++i){
temp.data[i] = this->data[i] * right;
}
return temp;
}
Test &Test::operator=(const Test &right){
if(this != &right){
if(this->size!=right.size){
delete [] this->data;
this->size = right.size;
this->data = new int[right.size];
}
for(int i = 0; i < size; ++i){
this->data[i] = right.data[i];
}
}
return *this;
}
Test::~Test(){
delete [] this->data;
}
int main() {
Test t(2);
Test s(5);
s = t*2;
for(int i = 0; i < s.size; ++i){
std::cout << s.data[i] << " ";
}
std::cin.get();
return 0;
} |
|