劍指offer之賦值運算子函式和單例模式

2021-09-13 10:49:28 字數 1498 閱讀 5074

一,題目:如下為型別為cmystring的宣告,請為該型別新增賦值運算子函式

class cmystring

類的預設函式有四個分別是建構函式,析構函式,拷貝建構函式和賦值運算子過載函式。

拷貝建構函式的形參一定要是引用,防止遞迴呼叫拷貝構造形參物件的情況。

賦值運算子的過載的形參為const,目的一是防止實參被修改,二是接收隱式生成的臨時量。

設計步驟:首先要進行自賦值的判斷,然後釋放舊的資源,最後賦新資源。

根據以上特點我們實現乙個賦值運算子的過載函式如下:

cmystring& cmystring::operator=(const cmystring& rhs)//返回乙個引用,為了允許連續賦值常量引數類

//型宣告為常量引用,避免形參傳實參時呼叫拷貝建構函式,賦值不改變傳入例項的狀態,所以傳入的引用應加上

//const關鍵字。

delete m_pdata;//防止出現記憶體洩漏

m_pdata = null;

m_pdata = new char[strlen(rhs.m_pdata)+1)]();

memcpy(m_pdata,rhs.m_pdata,strlen(rhs.m_pdata)+1);

return *this;

}

考慮到一種情況,由於我們是先delete了例項m_pdata的記憶體,此時如果我們new的時候記憶體不足,在賦值運算子內部出現乙個異常,cmystring的例項就會被修改,因此我們可以先申請記憶體後釋放舊記憶體;或者建立臨時例項,再交換臨時例項和原來的例項。臨時例項的生命週期到了之後系統會自動將其析構,這樣子保證了程式的異常安全性。

二,題目:設計乙個類,我們只能生成該類的乙個例項

典型的單例模式,實現單例模式需要以下幾點:1,把生成物件的介面遮蔽起來,包括建構函式和拷貝建構函式,將其寫在類的私有之下,由於只能生成乙個物件,所以拷貝建構函式根本用不上,所以我們不用實現,只要把宣告寫在私有之下就可以了。然後我們在類中提供乙個介面來生成唯一的物件

class singleton//普通模式下的單例模式

//static singleton& getinstance()

//private:

singleton(){}

singleton(const singleton&);

static singleton single;

};singleton singleton::single;

class singeton()//雙重鎖機制下的單例模式

//unlock();

}return psing;

}private:

singleton(){}

singleton(const singleton&);

static singleton* psing;

};singleton* singleton::psing = null;

劍指Offer 賦值運算子函式

按照自己淺薄的理解,敲了如下 include using namespace std class cmystring 就是定義了!cmystring char m pchar null cmystring const cmystring other cmystring cmystring opera...

劍指offer 賦值運算子函式

題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式 class cmystring 思路 類的定義和基本形式 類其實是定義乙個特殊的資料結構,定義了類的物件包括了什麼,以及可以在這個物件上執行哪些操作 class student 成員函式定義 student student vo...

劍指Offer之賦值運算子函式解析

題目 如下是型別cmystring的宣告,請為該型別新增賦值運算子函式 class cmystring 首先對於c 乙個類中的6個預設的函式分別是構造,拷貝構造,賦值運算子過載,析構,以及取位址操作符過載以及const修飾的取位址操作符過載。對於拷貝構造以及賦值運算子過載,預設的使用是淺拷貝,也就是...