關於含有指標成員的類的物件之間賦值指標的問題。

2021-07-15 12:39:12 字數 1668 閱讀 4092

在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的析構函式釋放陣列記憶體,...