# 題目:如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。
class cmystring
;
## 注意點
1.*連續賦值*:函式返回例項自身的引用(*this);
2.*形參為常量引用*:const保證傳入的例項不可修改,引用可以節省記憶體消耗,提高**效率;
3.*賦值之前釋放已有記憶體*:此為賦值操作,此前被賦值例項中的m_pdata已經初始化(即使m_pdata指向的是空字串),為了避免記憶體洩漏,在分配新記憶體之前要釋放自身已有的空間;
4.*自身不能進行賦值*:結合第3點,在賦值之前釋放了已有記憶體。若自身賦值給自身,則賦值時將找不到相應的記憶體(被釋放了),因此要先進行判斷;
##知識總結
1.初始化時的賦值呼叫的是拷貝建構函式;非初始化時的賦值呼叫的是賦值運算子函式;
如果物件在申明的同時馬上進行的初始化操作,則稱之為拷貝運算;
如果物件在申明之後,在進行的賦值運算,我們稱之為賦值運算
如:cmystring str2=str1;//呼叫拷貝建構函式
cmystring str3(str1);//呼叫拷貝建構函式
cmystring str4;
str4=str1//呼叫賦值運算子函式
2.深拷貝與淺拷貝
預設的拷貝建構函式和賦值運算子函式是以淺拷貝的方式進行的。
3.賦值運算子函式(返回左值的引用)
格式:
a a::operator=(a &a)
return *this;
問題:返回自身就可實現連續賦值,為何要返回自身的引用?
-賦值返回引用
x = y = z 先執行y = z,返回y的引用,執行x = y
-賦值不返回引用
x = y = z 先執行y = z,返回用y初始化的臨時物件(注意臨時物件都是常物件),再執行x = y的臨時物件(要求operator=(const x&) ),返回用x初始化的臨時物件(此處要求拷貝建構函式必須為x(const x&) )。
即每返回一次臨時物件時需要呼叫一次拷貝建構函式和一次析構函式。
*所以也並非必須返回引用,返回引用的好處既可以於賦值的原始語義已知,又可避免拷貝建構函式和析構函式的呼叫。*
4.使用strlen()是返回的長度是不包含'\0'的,如果要使用strcpy(str1,str2)進行複製時,
str1的長度應該要為strlen(str2)+1,即預留乙個空字元位。
源**:
#include#includeclass cmystring
;cmystring::cmystring(char *pdata)
else
}cmystring::cmystring(const cmystring &str)
cmystring::~cmystring()
cmystring& cmystring::operator = (const cmystring& str)
// ********************測試**********************
void cmystring::print()
void test1()
// 賦值給自己
void test2()
// 連續賦值
void test3()
int main(int argc, char* ar**)
劍指offer 面試題(1)
這兩天通過做作業接觸了 劍指offer 這本書 覺得裡面的面試題真是異常經典,當你看到那一道一道面試題時,對自我的做題筆試能力肯定會大有脾益 平常可以多做練習,養成乙個習慣 好了,廢話不多說了,直接上題吧 我已經感到 了 第一道 劍指offer 面試題14 調整陣列使奇數全部都位於偶數前面。題目 輸...
劍指offer 面試題1 賦值運算子函式
題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 當面試官要求應聘者定義乙個賦值運算子函式時,他對 會關注以下幾點 是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 只有返回乙個引用,才可以允許連續賦值。否則如...
劍指offer 面試題1 賦值運算子函式
題目要求為下面乙個類實現乙個賦值運算子的函式 class cmystring 我們要實現任意的乙個類的賦值運算子函式,都要注意一些方面 書上的解法給的確實很完備,而且後來用了一種巧妙的方法讓程式自動釋放記憶體。但我覺得重點是他提到的異常安全性的處理,這裡的話如果我們在new的時候記憶體不夠,而我們又...