(剑指Offer)面试题1:赋值运算符函数
題目:
如下為類(lèi)型CMyString的聲明,請(qǐng)為該類(lèi)型添加賦值運(yùn)算符函數(shù)。
class CMyString{
public:
??? CMyString(char* pData=NULL);
??? CMyString(const CMyString& str);
??? CMyString& operator=(const CMyString& str);
??? ~CMyString(void);
private:
??? char *m_pdata;
};
?
思路:
賦值運(yùn)算符函數(shù),注意四點(diǎn):
1、是否將返回值的類(lèi)型聲明為該類(lèi)型的引用,并在函數(shù)結(jié)束前返回實(shí)例自身的引用,即*this。只有返回一個(gè)引用,才可以允許連續(xù)賦值。
2、是否把傳入?yún)?shù)的類(lèi)型聲明為常量引用。如果傳入的參數(shù)不是引用而是實(shí)例,那么從形參到實(shí)參會(huì)調(diào)用一次復(fù)制構(gòu)造函數(shù),把參數(shù)聲明為引用可以避免這樣的無(wú)謂消耗,能提高代碼的效率。同時(shí),在賦值運(yùn)算符函數(shù)中不會(huì)改變傳入的實(shí)例的狀態(tài),因此應(yīng)該為傳入的引用參數(shù)加上const關(guān)鍵字。
3、是否釋放實(shí)例自身已有的內(nèi)存,如果忘記在分配新內(nèi)存之前釋放自身已有的空間,程序?qū)⒊霈F(xiàn)內(nèi)存泄露。
4、是否判斷傳入的參數(shù)和當(dāng)前實(shí)例*this是不是同一個(gè)實(shí)例。如果是同一個(gè),則不進(jìn)行賦值操作,直接返回。
5、注意淺拷貝和深拷貝
更多考慮:異常安全性等。
代碼:
?
#include <iostream> #include <string.h>using namespace std;class CMyString{ public:CMyString(const char* pData=NULL);CMyString(const CMyString& str);CMyString& operator=(const CMyString& str);char* getData(){return this->m_pdata;};~CMyString(void);private:char *m_pdata; };/* // shallow copy CMyString::CMyString(char* pData){m_pdata=pData; }CMyString::CMyString(const CMyString& str){*this=str; } */// deep copy CMyString::CMyString(const char* str){if(str==NULL){m_pdata=new char[1];m_pdata[0]='\0';}else{m_pdata=new char[strlen(str)+1];strcpy(m_pdata,str);} }CMyString::CMyString(const CMyString &str){m_pdata=new char[strlen(str.m_pdata)+1];strcpy(m_pdata,str.m_pdata); }CMyString::~CMyString(){delete[] m_pdata; }CMyString& CMyString::operator=(const CMyString &str){if(this==&str)return *this;delete []m_pdata;m_pdata=NULL;m_pdata=new char[strlen(str.m_pdata)+1];strcpy(m_pdata,str.m_pdata);return *this; }int main() {char a[]="hello";CMyString str(a);CMyString str1(str);CMyString str2;CMyString str3;str3=str2=str;cout << str.getData()<< endl;cout << str1.getData()<< endl;cout << str2.getData()<< endl;cout << str3.getData()<< endl;return 0; }運(yùn)行結(jié)果:
轉(zhuǎn)載于:https://www.cnblogs.com/AndyJee/p/4486043.html
總結(jié)
以上是生活随笔為你收集整理的(剑指Offer)面试题1:赋值运算符函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最简洁粗暴版的虚拟用户配置FTP
- 下一篇: Java高效读取大文件