(剑指Offer)面试题1:赋值运算符函数
題目:
如下為類型CMyString的聲明,請為該類型添加賦值運算符函數。
class CMyString{
public:
??? CMyString(char* pData=NULL);
??? CMyString(const CMyString& str);
??? CMyString& operator=(const CMyString& str);
??? ~CMyString(void);
private:
??? char *m_pdata;
};
?
思路:
賦值運算符函數,注意四點:
1、是否將返回值的類型聲明為該類型的引用,并在函數結束前返回實例自身的引用,即*this。只有返回一個引用,才可以允許連續賦值。
2、是否把傳入參數的類型聲明為常量引用。如果傳入的參數不是引用而是實例,那么從形參到實參會調用一次復制構造函數,把參數聲明為引用可以避免這樣的無謂消耗,能提高代碼的效率。同時,在賦值運算符函數中不會改變傳入的實例的狀態,因此應該為傳入的引用參數加上const關鍵字。
3、是否釋放實例自身已有的內存,如果忘記在分配新內存之前釋放自身已有的空間,程序將出現內存泄露。
4、是否判斷傳入的參數和當前實例*this是不是同一個實例。如果是同一個,則不進行賦值操作,直接返回。
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; }運行結果:
轉載于:https://www.cnblogs.com/AndyJee/p/4486043.html
總結
以上是生活随笔為你收集整理的(剑指Offer)面试题1:赋值运算符函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最简洁粗暴版的虚拟用户配置FTP
- 下一篇: Java高效读取大文件