类中赋值运算符重载函数
生活随笔
收集整理的這篇文章主要介紹了
类中赋值运算符重载函数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
聲明一個(gè)字符串類,為這個(gè)類型添加賦值運(yùn)算符
class MyString { public://構(gòu)造函數(shù)MyString(char* pData = NULL);//構(gòu)造函數(shù)MyString(const MyString& str);//析構(gòu)函數(shù)~MyString(void);//賦值運(yùn)算符MyString& operator=(const MyString& str);private:char* m_pData; };該字符串類中只有兩個(gè)構(gòu)造函數(shù),一個(gè)析構(gòu),一個(gè)賦值運(yùn)算符的重載,著重來說賦值運(yùn)算符的重載,重載之前將構(gòu)造函數(shù)和析構(gòu)函數(shù)實(shí)現(xiàn)了
MyString::MyString(char *pData) {if(pData == NULL){m_pData = new char[1];m_pData[0] = '\0';}else{m_pData = new char[strlen(pData) + 1];strcpy(m_pData, pData);} }MyString::MyString(const MyString &str) {m_pData = new char[strlen(str.m_pData) + 1];strcpy(m_pData, str.m_pData); }MyString::~MyString() {delete[] m_pData; }S1 = S2 ,S1傳給第一個(gè)參數(shù),S2傳給第二個(gè)參數(shù),賦值自然順理成章,以下是代碼:
MyString& MyString::operator=(const MyString& str) {if (this != &str) //如果相等,即就是給自身賦值,直接返回*this;{delete[]m_pData; //釋放原實(shí)例中 m_pData的內(nèi)存m_pData = NULL;m_pData = new char[strlen(str.m_pData) + 1];strcpy(m_pData, str.m_pData); //重新申請(qǐng)空間并完成拷貝}return *this; }但是,以上代碼書上說,還存在安全問題,說是,上例的賦值運(yùn)算重載中釋放了原有的實(shí)例對(duì)象內(nèi)存,而去重新申請(qǐng)了內(nèi)存,但是,一旦申請(qǐng)內(nèi)存失敗,也就是說new char 拋出了異常,m_pData將是一個(gè)空指針,問題就是一大堆,怎么辦呢?一種方法是:先new 一塊新內(nèi)存,在delete釋放已有的內(nèi)存,這樣,只有在內(nèi)存分配成功之后才會(huì)釋放原有內(nèi)容,分配失敗,原來的實(shí)例也不會(huì)被修改; MyString& MyString::operator=(const MyString& str) {if (this != &str){char* tmp = new char[strlen(str.m_pData) + 1];if (tmp != nullptr){delete[]m_pData;m_pData = NULL;m_pData = tmp;strcpy(m_pData, str.m_pData);}}return *this; }還有更好的寫法: MyString& MyString::operator=(const MyString& str) {if (this != &str){MyString tmp(str);swap(m_pData,tmp.m_pData); //庫中交換函數(shù) swap();}return *this; }還有大神是這樣寫的; String& operator=(String rhs) // 傳值{swap(rhs);return *this;}
拙見,歡迎糾正;
good
轉(zhuǎn)載于:https://www.cnblogs.com/melons/p/5791860.html
總結(jié)
以上是生活随笔為你收集整理的类中赋值运算符重载函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GDB动态库搜索路径
- 下一篇: 1-4:学习shell之操作文件与目录