在c++ 中,當定義了乙個類,類的成員中有指標的時候,需要注意:如果將類的物件a賦值給b的時候,兩個物件的指標是指向同乙個位址的,其餘的變數都是相等的。在影象處理中,比如定義了乙個影象類,類成員中有具體的影象資料,如果將兩個物件直接相等,會使兩個物件的資料指標指向同乙個位址。如果要使兩個物件的指向不同的位址可以為類定義乙個函式,用於兩個物件之間的直接賦值運算。下面以例子說明。
宣告了乙個類:
class cimgdata
; 主函式:
int main()
cout << a.pimgdata << endl;
cimgdata b;
//acimgdatatobcimgdata(a, b);
b = a;
cout << b.pimgdata << endl;
for (int m = 0; m < 10; m++)
cout << b.pimgdata[m] << endl;
cout << "b.width= " << b.width << endl;
cout << "b.height=" << b.height << endl;
cout << "completed" << endl;
}
執行結果:
可以看出:a和b的資料指標的位址相同,相關的變數被複製。
改進:為類新增物件賦值函式
void acimgdatatobcimgdata(cimgdata a, cimgdata b)
} 主函式:
int main()
cout << a.pimgdata << endl;
cimgdata b;
acimgdatatobcimgdata(a, b);
cout << b.pimgdata << endl;
for (int m = 0; m < 10; m++)
cout << b.pimgdata[m] << endl;
cout << "b.width= " << b.width << endl;
cout << "b.height=" << b.height << endl;
cout << "completed" << endl;
return 0;
}
執行結果如下:
結果顯示:兩個物件的指標位址不一樣,因此連個物件的沒有聯絡,只是單純將相關的資料複製傳遞。但是,注意到這個時候width和height兩個成員沒有傳遞,是因為,資料變數作為函式的形參傳遞的時候,使用的拷貝的臨時變數。
改進:使用引用傳遞。
將函式改為如下,其餘的部分不變:
void acimgdatatobcimgdata(cimgdata &a, cimgdata &b)
}
結果如下:
含有指標成員的類的拷貝
題目 下面是乙個陣列類的宣告與實現。請分析這個類有什麼問題,並針對存在的問題提出幾種解決方案。template class array array voidsetvalue unsigned index,const t value t getvalue unsignedindex const pri...
含有指標成員的類的拷貝
題目 下面是乙個陣列類的宣告與實現。請分析這個類有什麼問題,並針對存在的問題提出幾種解決方案。1 templateclass array29 10 array 1114 15void setvalue unsigned index,const t value 1620 21 t getvalue u...
函式返回含有指標成員的物件
移動構造 淺層複製只實現物件間的資料元素一一對應,只複製成員函式中的指標位址,如下圖 pointarray2複製了pointarray1,只複製了指標,pointarray2與pointarray1指向了同一塊陣列元素,在執行後進行記憶體釋放時會先呼叫pointarray1的析構函式釋放陣列記憶體,...