簡單地複製所有的值時,編譯器提供複製構造器的默認行爲。這被稱爲「淺拷貝」。
更復雜的行爲是通過實現自己的構造函數來實現的,以便您的引用指向的對象(這裏是值)在副本中重新創建。
foo::foo(std::istream& s) {
max = s.max;
val = new int;
*val = s->val;
listofVal = new size_t;
*listofVal = s->listofVal;
}
將是實現被稱爲「深度複製」的一種方式。
但是,作爲你的一個成員被稱爲listofVal
我寧願覺得你正在做的事情不是在它指向的內存地址上存儲單個值,在這種情況下,你應該對其中包含的元素數進行計數,我將從此以後假設爲您稱爲max
的字段。要複製整個列表,你的拷貝構造函數,然後必須是:
foo::foo(std::istream& s) {
max = s.max;
val = new int;
*val = s->val;
listofVal = new size_t[max];
for (int i = 0; i < max; ++i)
listofVal[i] = s->listofVal[i];
}
拉維,是的,拷貝構造函數是構建的,儘管打破了「規則三」的證明可以在另一個之前實現兩個。這是賦值運算符。
foo& foo::operator=(const foo& matrix) {
if (this != matrix) {
max = matrix.max;
val = new int;
*val = matrix->val;
listofVal = new size_t[max];
for (int i = 0; i < max; ++i)
listofVal[i] = matrix->listofVal[i];
}
}
將適用於object1 = object2;
作業。我傾向於複製構造函數的方法。
的方法必須是會員訪問私人數據,以便類應該像
class foo {
///...///As before
foo &operator=(const foo& matrix);
};
當然它需要一個析構函數,但因爲它沒有明確要求,我不想回答什麼WASN我問道。
從鏈接複製和交換成語,當LHS可能已經包含數據,強大的任務之後你可能會考慮:
foo& foo::operator=(const foo& matrix) {
if (this != matrix) {
val = new int;
*val = matrix->val;
size_t* newArray = new size_t[max];
int newMax = matrix.max;
std::copy(matrix.listofVal, matrix.listofVal + max, newArray);
if (listofVal) delete listofVal;
listofVal = newArray;
max = newMax;
}
}
我想補充一點,在堆中分配的本地對象可引起內存泄漏(如果方法在它們被分配給負責刪除的對象之前中斷),但是當我們有足夠的時間來保持類的完整性時,這只是一個完整的黑暗層。
這看起來像作業。你已經嘗試了什麼? –
@sasha我已經嘗試過讓'private'變量'mutable',但我認爲這相當難看。 – SNpn
SNpn:您的重載操作符是您的'foo'類的成員,因此可以訪問私有成員數據。 – razlebe