#include <iostream>
using namespace std;
class Array
{
private:
int* p;
int n;
public:
Array() {}
Array(int* a, int b) { p = a; n = b; }
Array(const Array& Arr) { p = Arr.p; n = Arr.n; }
Array operator ++()
{
for (int i = 0; i < n; i++)
{
*(p + i) += 1;
}
return*this;
}
Array operator ++(int)
{
Array temp = *this;
for (int i = 0; i < n; i++)
{
*(p + i) += 1;
}
return temp;
}
friend Array operator --(Array& A)
{
for (int i = 0; i < A.n; i++)
{
*(A.p + i) -= 1;
}
return A;
}
friend Array operator --(Array& A,int)
{
Array temp = A;
for (int i = 0; i < A.n; i++)
{
*(A.p + i) -= 1;
}
return temp;
}
void print()
{
for (int i = 0; i < n; i++)
{
cout << *(p + i)<<" ";
}
cout << endl;
}
~Array(){}
};
int main()
{
int H[7], i;
for (i = 0; i < 7; i++)
{
cin >> H[i];
}
Array* Arr = new Array(H, i);
cout << "輸出前置自加結果:";
(++(*Arr)).print();
cout << "輸出先前置自加再后置自加結果:";
((*Arr)++).print();
cout << "輸出先前置自加再后置自加再前置自減結果:";
(--(*Arr)).print();
cout << "輸出先前置自加再后置自加再前置自減再后置自減結果:";
((*Arr)--).print();
delete Arr;
}
uj5u.com熱心網友回復:
問題很簡單啊,你的拷貝函式,拷貝出來的新物件的p和原來的物件*this的p指向的地址是一樣的,所以后面*this的p陣列內容變了,新物件也能看到相同的資訊,所以你列印出來的就是2222222(*this的p指向的陣列變成2222222,新物件的p指向相同的陣列)Array operator ++(int)
{
Array temp = *this; //temp的p和*this的p指向相同的地址
for (int i = 0; i < n; i++)
{
*(p + i) += 1;
}
return temp;
}
所以最大的問題就是建構式和拷貝函式,應該是讓新物件的p指向新的記憶體,然后把原來物件的p指向的陣列資訊拷貝過來,而不是直接讓新物件的p和原來的p相等
所以修改建構式
Array(int* a, int b) { p=new int[b]; memcpy(p, a, sizeof(int)*b); n = b; } //p指向新的陣列
Array(const Array& Arr) { p=new int[Arr.n]; memcpy(p, Arr.p, sizeof(int)*Arr.n); n = Arr.n; } //p指向新的陣列,而不是和原來的陣列相同
因為建構式給p分配了記憶體,所以解構式要釋放記憶體
~Array(){if (p) delete []p;}
uj5u.com熱心網友回復:
WC,大佬牛逼
uj5u.com熱心網友回復:
謝謝大佬點撥
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195502.html
標籤:C++ 語言
上一篇:c++資料結構順序表的
下一篇:Qt打斷點除錯出錯
