拷貝控制:
拷貝建構函式,拷貝賦值運算子,移動建構函式,移動賦值運算子,析構函式
//拷貝建構函式
//class
sales_data ;
sales_data::sales_data(
const sales_data &orig) : bookno(orig.bookno), uints_sold(orig.uints_sold), revenue(orig.revenue) {}
如果沒有定義拷貝建構函式,編譯器會定義乙個。即使自己定義了拷貝建構函式,編譯器也會合成乙個。
sales_data::sales_data(const sales_data &orig) : bookno(orig.bookno), uints_sold(orig.uints_sold), revenue(orig.revenue) {}
拷貝初始化:
直接初始化:string dot(10,'.');
拷貝初始化:string s2 = dot;
//拷貝建構函式發生:將物件作為實參傳給非引用的形參
//返回乙個非引用型別的物件
//使用=進行拷貝
1 sales_data & sales_data::operator = (const sales_data &rhs) //賦值運算子
4extern vectorint>> permutations(vector &nums);
三五法則
//需要析構函式的類也需要拷貝和賦值操作
classhasptr ;
~hasptr()
private
:
string *ps;
inti;
};
//使用預設的拷貝建構函式和拷貝賦值運算子,導致多個hasptr物件指向相同記憶體
hasptr f(hasptr hp)
//ret和hp的ps以及傳入實參都指向統一記憶體,析構函式呼叫時會出現delete兩次相同記憶體,出新錯誤
需要拷貝操作的類也需要賦值操作
classnumbered ;
//析構函式不能是刪除的成員刪除的成員
struct
personinfo ;
1//行為像值的類
2class
hasptr ;
5 hasptr(const hasptr &p) :
6 ps(new std::string(*p.ps)), i(p.i) {};
78 ~hasptr()
9private:10
string *ps;
11int
i;12
};13 hasptr& hasptr::operator = (const hasptr &rhs)
2324
//行為像指標的類
25//
最好的方法是使用shared_ptr來管理類中的資源,第二種是引用計數
26//
除了初始化物件外,每個建構函式要建立乙個引用計數
27//
拷貝建構函式不分配新的計數器而是拷貝給頂物件的資料成員,包括計數器,拷貝建構函式遞增共享的計數器
28//
析構函式遞減共享的計數器
29//
拷貝賦值運算遞增右側運算物件的計數器,遞減左側物件的計數器
3031
3233
//將計數器儲存在動態記憶體中
34class
hasptr ;
38 hasptr(const hasptr &p) :
39ps(p.ps), i(p.i), use(p.use) ;//
ps儲存拷貝物件的記憶體
4243 ~hasptr()
44private:45
string *ps;
46int
i;47 std::size_t *use;
48};
49 hasptr::~hasptr() 54}
55 hasptr& hasptr::operator = (const hasptr &rhs)
61 ps =rhs.ps;
62 i =rhs.i;
63 use =rhs.use;
64return *this;65
}66class
hasptr ;
70 ~hasptr()
71private:72
string *ps;
73int
i;74
75};
76 inline void swap(hasptr &lhs, hasptr &rhs)
類例項的拷貝
問題情境 需要完全複製 深拷貝 另乙個例項,以保留現有的物件作後續處理等作用。原理綜述 物件的淺拷貝僅需在該類中新增乙個方法 public myimage clone 深拷貝有幾種 針對可序列化 serializable 的類,可以宣告利用二進位制或序列化進行拷貝的方法。網上有我不再贅述。不方便序列...
Item 14 資源管理類的拷貝
raii物件只能管理堆上new出來的資源,其它的不行。比如下面的mutex 只能自定義乙個資源管理類,來管理這個mutex資源,以防止它被意外地忽略。使用方法如下 如果拷貝乙個raii資源,會發生什麼?一般的處理方式 1 因為有的拷貝raii資源無意義,比如lock。所以禁止拷貝 2 如果拷貝有意義...
Item 14 資源管理類的拷貝
raii物件只能管理堆上new出來的資源,其它的不行。比如下面的mutex void lock mutex pm lock mutex pointed to by pm void unlock mutex pm unlock the mutex 只能自定義乙個資源管理類,來管理這個mutex資源,以...