拷貝控制和資源管理
*定義乙個拷貝建構函式,完成string的拷貝,而不是拷貝指標
*定義乙個析構函式來釋放string
*定義乙個拷貝賦值運算子來釋放物件當前的string,並從右側運算物件拷貝string
class hasptr
//對ps指向的string,每個hasptr物件都有自己的拷貝
hasptr(const hasptr &p):ps(new string(*p.ps)), i(p.i) {}
hasptr & operator=(const hasptr &);
~hasptr()
private:
string *ps;
int i;
};
hasptr& hasptr::operator=(const hasptr &rhs)
這裡有乙個錯誤的示範!!
hasptr& hasptr::operator=(const hasptr &rhs)
看出來了麼,這裡new string(*(rhs.ps))裡面的ps是已經釋放了的,也就是把釋放過的記憶體拿來賦值,顯然是未定義的
令乙個類展現類似指標的行為的最好的方法是使用shared_ptr來管理類中的資源
但是,有時候我們希望直接管理資源。在這種情況下,使用引用計數
void fun1()
class hasptr2
//拷貝建構函式拷貝所有三個資料成員,並遞增計數器
hasptr2(const hasptr2 &p):ps2(p.ps2), i2(p.i2), use(p.use)
hasptr2 & operator=(const hasptr2 &);
~hasptr2();
private:
string *ps2;
int i2;
size_t *use; //記錄有多少個物件共享*ps的成員
};hasptr2::~hasptr2()
}hasptr2 & hasptr2::operator=(const hasptr2 &rhs)
/*上面這個if應該如何去看呢?
rhs拷貝給乙個物件的時候,指向rhs的物件就會多乙個所以++
然後拷貝的物件,得到新值就會把原來的值去掉所以會--
然後看是不是最後乙個是的話直接銷毀,不是那就不管--就可以了
*/ps2=rhs.ps2;
i2=rhs.i2;
use=rhs.use;
return *this; //返回本物件
}
/**
* 功能:拷貝控制和資源管理
*/#include#includeusing namespace std;
/**************************************
13.2.1行為像值的類
**************************************/
/**定義乙個拷貝建構函式,完成string的拷貝,而不是拷貝指標
*定義乙個析構函式來釋放string
*定義乙個拷貝賦值運算子來釋放物件當前的string,並從右側運算物件拷貝string
*/class hasptr
//對ps指向的string,每個hasptr物件都有自己的拷貝
hasptr(const hasptr &p):ps(new string(*p.ps)), i(p.i) {}
hasptr & operator=(const hasptr &);
~hasptr()
private:
string *ps;
int i;
};/**
類值拷貝賦值運算子
*/hasptr& hasptr::operator=(const hasptr &rhs)
//這裡有乙個錯誤的示範!!
/*hasptr& hasptr::operator=(const hasptr &rhs)
*///看出來了麼,這裡new string(*(rhs.ps))裡面的ps是已經釋放了的,也就是把釋放過的記憶體拿來賦值,顯然是未定義的
/**************************************
13.2.2定義行為像指標的類
**************************************/
/*令乙個類展現類似指標的行為的最好的方法是使用shared_ptr來管理類中的資源
但是,有時候我們希望直接管理資源。在這種情況下,使用引用計數
*//**
引用計數
*/void fun1()
/**定義乙個使用引用計數的類
*/class hasptr2
//拷貝建構函式拷貝所有三個資料成員,並遞增計數器
hasptr2(const hasptr2 &p):ps2(p.ps2), i2(p.i2), use(p.use)
hasptr2 & operator=(const hasptr2 &);
~hasptr2();
private:
string *ps2;
int i2;
size_t *use; //記錄有多少個物件共享*ps的成員
};hasptr2::~hasptr2()
}hasptr2 & hasptr2::operator=(const hasptr2 &rhs)
/*上面這個if應該如何去看呢?
rhs拷貝給乙個物件的時候,指向rhs的物件就會多乙個所以++
然後拷貝的物件,得到新值就會把原來的值去掉所以會--
然後看是不是最後乙個是的話直接銷毀,不是那就不管--就可以了
*/ps2=rhs.ps2;
i2=rhs.i2;
use=rhs.use;
return *this; //返回本物件
}int main()
ps:這期還是沒有效果圖,因為我都沒有在主函式中加相應的函式,不過無所謂啦,**是沒錯的,能通過編譯,至少沒有語法錯誤,還有就是定義類,應該不會出現邏輯錯誤吧!!!嘿嘿,其實這節應該可以9點左右就發出來的,但是你能想象我9點左右出去列印**嗎????
列印 蒼老師的**!!!蒼老師!!!沒錯就是蒼井空。。。。列印室的老闆盯著我看了半天,這傢伙幹嘛。。。。
c primer要點 拷貝控制
1.default 顯式要求編譯器生成合成版本 delete 定義為刪除的函式阻止拷貝。2.右值引用只能繫結到將要銷毀的物件 std move 獲得繫結到左值上的右值引用 移動建構函式的第乙個引數應該是該型別的右值引用,移動操作不應丟擲異常,可以指明noexcept承諾。標準庫容器能對異常發生時其自...
C primer學習 拷貝控制 1
1 我們使用 定義變數 2 從乙個返回型別為非引用的函式返回物件 3 用花括號列表初始化乙個陣列中的元素或者乙個聚合類的成員.4 某些類型別對它們所分配的物件使用拷貝初始化.point global point foo bar point arg 第1處 第4,5初 return heap 第6處 ...
C primer學習 拷貝控制 3
strblob const strblob rhs 拷貝初始化 strblob operator const strblob rhs 練習 定義乙個使用引用計數的hasptr類class hasptr 在拷貝建構函式中定義三個成員,並且初始化引用計數為1 hasptr const hasptr h ...