類的拷貝管理

2022-09-01 18:18:08 字數 2470 閱讀 4265

拷貝控制:

拷貝建構函式,拷貝賦值運算子,移動建構函式,移動賦值運算子,析構函式

//

拷貝建構函式

//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);

三五法則

//需要析構函式的類也需要拷貝和賦值操作

class

hasptr ;

~hasptr()

private

:

string *ps;

inti;

};

//使用預設的拷貝建構函式和拷貝賦值運算子,導致多個hasptr物件指向相同記憶體

hasptr f(hasptr hp)

//ret和hp的ps以及傳入實參都指向統一記憶體,析構函式呼叫時會出現delete兩次相同記憶體,出新錯誤

需要拷貝操作的類也需要賦值操作

class

numbered ;

//析構函式不能是刪除的成員刪除的成員

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資源,以...