深拷貝的實現:
方式一:
#define _crt_secure_no_warnings 1
#includeusing namespace std;
#include#include//深拷貝
class string
else
}*///正確寫法二:比一簡單點
//好處:不用擔心傳入空指標問題
//當傳入空指標和無參物件時,也開闢空間,乙個位元組(存放『\0')
//當傳入有參物件時,也要多開闢乙個位元組的空間,存放『\0'
string(const char*str="")//注意這裡是"",不是" ",它倆的長度不一樣,第乙個長度為0(因為裡面存的是'\0'),第二個長度為1
_str = new char[strlen(str) + 1];//當傳入空指標時,開闢了1個char型別的空間,放\0
strcpy(_str, str);
} //這種寫法對string s1(nullptr)不適用,strlen(str)會出錯,不能對空指標求字串長度
//string(char*str="")
// :_str(new char[strlen(str)+1])
// //拷貝構造
string(string&s)
:_str(new char[strlen(s._str) + 1])
//賦值運算子過載 以為例a=b("hello")
//思路:a物件可能無參,無參物件構造時只開闢了乙個char空間,儲存'\0',那麼b中內容直接strcpy拷貝給a時就會出問題
//所以,正確步驟為:
//(1)先開闢新空間char*ptr=new char[strlen(b的字串長度)+1];
//(2)將b中的字串拷貝到ptr指向的空間中
//(3)釋放a物件指標指向的舊空間
//(4)將a物件中指標所指的字串空間指向為ptr(a._str=ptr)
//改進點:如果是自己給自己賦值,則不用那麼麻煩,直接返回原物件
/*string&operator=(string&s)
return *this;
}*/string&operator=(string&s)
return *this;
} //析構函式
~string()
*/ //這種方式存在的問題:對於(2)傳入空指標 ,strlen(空指標)程式崩潰
/*string(char*str="")
:_str(new char[strlen(str) + 1])
*/ //建構函式
//正確書寫方式
//要考慮的點:傳參方式->(1)無參(2)傳入空指標(3)有參
string(const char*str="")
_str = new char[strlen(str) + 1];
strcpy(_str, str);
} //拷貝構造
//思路:構造乙個臨時物件tmp,引數為s._str。這裡是呼叫的建構函式
//注意要點:_str要初始化為空。因為當前物件的指標如果不初始化為空,則是個隨機值,最後交換後,tmp中儲存的就是這個隨機值
string(const string&s)
:_str(nullptr)
//賦值運算子過載(簡潔版)
//思路:同樣利用構造臨時物件的方法,注意這裡引數是s,呼叫的是拷貝建構函式
//注意要點:(1)因為傳的是引用,所以臨時物件需要手動構建
//(2)防止自己給自己賦值
/*string&operator=(const string&s)
return *this;
}*///賦值運算子過載(最簡潔版)
//相比於上面(簡潔版),這個(最簡潔版)的優點是:
//(1)將構建臨時物件的時機交給了編譯器來做
//(2)不用手動判斷自己給自己賦值的問題,因為採用的是值拷貝,永遠出現自己給自己賦值的情況
string&operator=(string s)
~string()
private:
char*_str;
};int main()
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...
淺拷貝與深拷貝
淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...