01_AssignmentOperator详细解释
生活随笔
收集整理的這篇文章主要介紹了
01_AssignmentOperator详细解释
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
代碼出自劍指offer,自己做了詳細(xì)的注釋,代碼如下:
#include<cstring> #include<cstdio> #include<iostream>using namespace std;class CMyString { public:CMyString(const char* pData = nullptr);//構(gòu)造函數(shù)CMyString(const CMyString& str);//構(gòu)造函數(shù)~CMyString(void);//析構(gòu)函數(shù)CMyString& operator = (const CMyString& str);//算術(shù)符重載void Print();private:char* m_pData; };CMyString::CMyString(const char *pData)//傳一個(gè)字符串進(jìn)去 {if (pData == nullptr){m_pData = new char[1]; //開辟空間大小為1m_pData[0] = '\0';}else{int length = strlen(pData);m_pData = new char[length + 1];strcpy_s(m_pData, length + 1, pData);//因?yàn)橐紤]\0占據(jù)一個(gè)單位,所以是length + 1,這里是把pData賦值給m_pData的意思} }CMyString::CMyString(const CMyString &str)//傳一個(gè)對(duì)象進(jìn)去 {int length = strlen(str.m_pData);m_pData = new char[length + 1];strcpy_s(m_pData, length + 1, str.m_pData); }CMyString::~CMyString()//析構(gòu)函數(shù) {delete[] m_pData; }// 重載 + 運(yùn)算符,用于把兩個(gè) Box 對(duì)象相加 //Box operator + (const Box& b) CMyString& CMyString::operator = (const CMyString& str)//算術(shù)符號(hào)重載,返回類型是對(duì)象的引用,::operator =表示重載函數(shù)在類外面被調(diào)用,(const CMyString& str)表示被重載的=右側(cè)的的數(shù)據(jù)類型是什么 {if (&str != this)//這個(gè)意思是,如果當(dāng)前對(duì)象和原有的對(duì)象不是同一個(gè)的話{CMyString strTemp(str);char* pTemp = strTemp.m_pData;strTemp.m_pData = m_pData;m_pData = pTemp;}//假設(shè)我們的算術(shù)重載最終是想要執(zhí)行CMyString xxx=y這樣的操作。//注意,這里離開if以后,strTemp會(huì)被自動(dòng)析構(gòu),而pTemp也會(huì)被刪除,因?yàn)樗鼈兌际蔷植孔兞?/這里之所以這么操作,是因?yàn)?#xff0c;如果直接把str賦值給this的話,可能需要為m_pData開辟的空間不夠了,這個(gè)時(shí)候//m_pData就會(huì)得到一個(gè)空指針,最終在cout輸出空指針時(shí)就會(huì)掛掉。//掛掉只是其次,原來的CMyString數(shù)據(jù)可能也會(huì)被毀掉,因?yàn)榭赡軋?zhí)行了CMyString xxx=NUll這樣的語句效果//為了不毀掉原來的CMyString xxx中的內(nèi)容,先把str的內(nèi)容拷貝到一個(gè)臨時(shí)的對(duì)象CMyString strTemp中//那么此時(shí),即使空間不夠程序掛掉,原來的CMyString xxx的數(shù)據(jù)也不會(huì)被毀掉。//也就是說空指針進(jìn)行賦值是不會(huì)導(dǎo)致崩潰的,但是輸出空指針是會(huì)導(dǎo)致程序崩潰的cout <<this << endl;return *this;//返回當(dāng)前對(duì)象的引用,如果是return this,那么就返回當(dāng)前對(duì)象的地址 }//這里之所以是返回*this,是因?yàn)橹剌d本身就是在處理對(duì)象,或者說,是在調(diào)整對(duì)象的屬性,所以調(diào)整前和調(diào)整后,都是對(duì)象進(jìn),對(duì)象出。// ====================測(cè)試代碼==================== void CMyString::Print() {printf("%s", m_pData); }void Test1() {printf("Test1 begins:\n");const char* text = "Hello world"; //不可更改的字符串指針CMyString str1(text);//利用構(gòu)造函數(shù)進(jìn)行初始化CMyString str2;str2 = str1;//對(duì)象賦值printf("The expected result is: %s.\n", text);printf("The actual result is: ");str2.Print();printf(".\n"); }// 賦值給自己 void Test2() {printf("Test2 begins:\n");const char* text = "Hello world";CMyString str1(text);str1 = str1;printf("The expected result is: %s.\n", text);printf("The actual result is: ");str1.Print();printf(".\n"); }// 連續(xù)賦值 void Test3() {printf("Test3 begins:\n");const char* text = "Hello world";CMyString str1(text);CMyString str2, str3;str3 = str2 = str1;printf("The expected result is: %s.\n", text);printf("The actual result is: ");str2.Print();printf(".\n");printf("The expected result is: %s.\n", text);printf("The actual result is: ");str3.Print();printf(".\n"); }int main(int argc, char* argv[]) {Test1();Test2();Test3();cin.get();cin.get();return 0; }
#include<cstring> #include<cstdio> #include<iostream>using namespace std;class CMyString { public:CMyString(const char* pData = nullptr);//構(gòu)造函數(shù)CMyString(const CMyString& str);//構(gòu)造函數(shù)~CMyString(void);//析構(gòu)函數(shù)CMyString& operator = (const CMyString& str);//算術(shù)符重載void Print();private:char* m_pData; };CMyString::CMyString(const char *pData)//傳一個(gè)字符串進(jìn)去 {if (pData == nullptr){m_pData = new char[1]; //開辟空間大小為1m_pData[0] = '\0';}else{int length = strlen(pData);m_pData = new char[length + 1];strcpy_s(m_pData, length + 1, pData);//因?yàn)橐紤]\0占據(jù)一個(gè)單位,所以是length + 1,這里是把pData賦值給m_pData的意思} }CMyString::CMyString(const CMyString &str)//傳一個(gè)對(duì)象進(jìn)去 {int length = strlen(str.m_pData);m_pData = new char[length + 1];strcpy_s(m_pData, length + 1, str.m_pData); }CMyString::~CMyString()//析構(gòu)函數(shù) {delete[] m_pData; }// 重載 + 運(yùn)算符,用于把兩個(gè) Box 對(duì)象相加 //Box operator + (const Box& b) CMyString& CMyString::operator = (const CMyString& str)//算術(shù)符號(hào)重載,返回類型是對(duì)象的引用,::operator =表示重載函數(shù)在類外面被調(diào)用,(const CMyString& str)表示被重載的=右側(cè)的的數(shù)據(jù)類型是什么 {if (&str != this)//這個(gè)意思是,如果當(dāng)前對(duì)象和原有的對(duì)象不是同一個(gè)的話{CMyString strTemp(str);char* pTemp = strTemp.m_pData;strTemp.m_pData = m_pData;m_pData = pTemp;}//假設(shè)我們的算術(shù)重載最終是想要執(zhí)行CMyString xxx=y這樣的操作。//注意,這里離開if以后,strTemp會(huì)被自動(dòng)析構(gòu),而pTemp也會(huì)被刪除,因?yàn)樗鼈兌际蔷植孔兞?/這里之所以這么操作,是因?yàn)?#xff0c;如果直接把str賦值給this的話,可能需要為m_pData開辟的空間不夠了,這個(gè)時(shí)候//m_pData就會(huì)得到一個(gè)空指針,最終在cout輸出空指針時(shí)就會(huì)掛掉。//掛掉只是其次,原來的CMyString數(shù)據(jù)可能也會(huì)被毀掉,因?yàn)榭赡軋?zhí)行了CMyString xxx=NUll這樣的語句效果//為了不毀掉原來的CMyString xxx中的內(nèi)容,先把str的內(nèi)容拷貝到一個(gè)臨時(shí)的對(duì)象CMyString strTemp中//那么此時(shí),即使空間不夠程序掛掉,原來的CMyString xxx的數(shù)據(jù)也不會(huì)被毀掉。//也就是說空指針進(jìn)行賦值是不會(huì)導(dǎo)致崩潰的,但是輸出空指針是會(huì)導(dǎo)致程序崩潰的cout <<this << endl;return *this;//返回當(dāng)前對(duì)象的引用,如果是return this,那么就返回當(dāng)前對(duì)象的地址 }//這里之所以是返回*this,是因?yàn)橹剌d本身就是在處理對(duì)象,或者說,是在調(diào)整對(duì)象的屬性,所以調(diào)整前和調(diào)整后,都是對(duì)象進(jìn),對(duì)象出。// ====================測(cè)試代碼==================== void CMyString::Print() {printf("%s", m_pData); }void Test1() {printf("Test1 begins:\n");const char* text = "Hello world"; //不可更改的字符串指針CMyString str1(text);//利用構(gòu)造函數(shù)進(jìn)行初始化CMyString str2;str2 = str1;//對(duì)象賦值printf("The expected result is: %s.\n", text);printf("The actual result is: ");str2.Print();printf(".\n"); }// 賦值給自己 void Test2() {printf("Test2 begins:\n");const char* text = "Hello world";CMyString str1(text);str1 = str1;printf("The expected result is: %s.\n", text);printf("The actual result is: ");str1.Print();printf(".\n"); }// 連續(xù)賦值 void Test3() {printf("Test3 begins:\n");const char* text = "Hello world";CMyString str1(text);CMyString str2, str3;str3 = str2 = str1;printf("The expected result is: %s.\n", text);printf("The actual result is: ");str2.Print();printf(".\n");printf("The expected result is: %s.\n", text);printf("The actual result is: ");str3.Print();printf(".\n"); }int main(int argc, char* argv[]) {Test1();Test2();Test3();cin.get();cin.get();return 0; }
上圖是代碼中的異常安全處理部分的數(shù)據(jù)流圖
關(guān)于空指針導(dǎo)致崩潰問題可以參考點(diǎn)擊打開鏈接
總結(jié)
以上是生活随笔為你收集整理的01_AssignmentOperator详细解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 空指针引起的崩溃
- 下一篇: 03_FindInPartiallySo