CMyString实现

来源:互联网 发布:网络流传的父女唱的歌 编辑:程序博客网 时间:2024/04/27 20:49

有一个关于C++的面试题,我也做了一下,虽然基础,但是期间也是费了一些周折,为了理解C++的其他一些概念,我多加入了一些内容,把最终的结果放到这里。题是这样的:

类CMyString的声明如下:
class CMyString
{
public:
      CMyString(char* pData = NULL);
      CMyString(const CMyString& str);
      ~CMyString(void);
      CMyString& operator = (const CMyString&str);

private:

      char*m_pData;

};

请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异常,对象的状态不能改变。


在VC++ 2010中编译通过:

#include "StdAfx.h"#include <iostream>#include <string>class CMyString{public://CMyString()//{//m_pData = NULL;//};//既是默认构造函数也是初始化构造函数,所以上面的代码不需要了,否则编译错误CMyString(char* pData = NULL){cout << "Enter default/initialization constructor" << endl;m_pData = NULL;if(pData != NULL){m_pData = new char[strlen(pData)+1];strcpy(m_pData,pData);}};CMyString(const CMyString& str){cout << "Enter copy constructor" << endl;//不可能有值,一定要初始化,否则在operator=中会异常m_pData = NULL;//在Effect C++中似乎不建议这么干*this = str;};~CMyString(void){cout << "Enter destructor" << endl;if(m_pData != NULL){delete [] m_pData;}};CMyString& operator = (const CMyString& str){cout << "Enter operator=" << endl;if(this == &str)return *this;try{char * tmp = new char[strlen(str.m_pData)+1];strcpy(tmp,str.m_pData);if(m_pData != NULL)delete [] m_pData;m_pData = tmp;return *this;}catch(...){return *this;}};char * GetData(){return m_pData;}private:char* m_pData;};void PrintMyString(CMyString str){cout << str.GetData() << endl;}void main() {char * s = "hello";cout << "step 01" << endl;//初始化构造函数被调用CMyString str1(s);cout << "step 02" << endl;//拷贝构造函数被调用CMyString str2(str1);cout << "step 03" << endl;//默认构造函数被调用CMyString str3;//operator=被调用str3 = str1;cout << "step 04" << endl;//声明时初始化,拷贝构造函数被调用CMyString str4 = str1;cout << "step 05" << endl;//传值,拷贝构造函数被调用PrintMyString(str1);return;}

输出为:

step 01Enter default/initialization constructorstep 02Enter copy constructorEnter operator=step 03Enter default/initialization constructorEnter operator=step 04Enter copy constructorEnter operator=step 05Enter copy constructorEnter operator=helloEnter destructorEnter destructorEnter destructorEnter destructorEnter destructor



0 0
原创粉丝点击