从昨天开始,我希望自己能够每天坚持下来。每天一道面试题,每天都有成长。距离找工作的日子越来越近,珍惜现在的学生生活。希望我能坚持下来,好好地努力,找到一个理想的工作。其实,一直在犹豫到底使用哪种语言去做这些题目,现在终于想通了,C++是个不错的选择。坚持努力下去吧!参考了一些网上的代码,自己对照着学习了下。
代码:
#include <iostream> #include <stdlib.h> using namespace std; class CMyString { public: CMyString( char* pData = NULL); //构造函数 CMyString( const CMyString& str); //拷贝构造函数 ~CMyString( void ); //析构函数 CMyString& CMyString::operator = (const CMyString &str); //重载赋值运算符 void CMyString::print(); //打印字符串 private: char* m_pData; //数据域,字符指针 }; //打印字符串 void CMyString::print() { cout<< m_pData <<endl; } //构造函数 CMyString::CMyString(char* pData) { if(pData == NULL) { m_pData = new char[1]; m_pData[0]='\0'; } else { int len = strlen(pData); m_pData = new char[len+1]; strcpy(m_pData, pData); } } //拷贝构造函数 CMyString::CMyString(const CMyString& str) { int len = strlen(str.m_pData); m_pData = new char[len+1]; strcpy(m_pData, str.m_pData); } //析构函数 CMyString::~CMyString(void) { delete[] m_pData; } //重载运算符 CMyString& CMyString::operator=(const CMyString &str) { /** 解法一:这种解法没有考虑到如果删掉m_pData后,new char时内存不足的问题 //如果传入的参数与当前的实例是同一个实例,则直接返回自身 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); **/ /** 比较好的解法二:先new成功后再delete if(this != &str) { char* temp = new char[strlen(str.m_pData)+1]; delete[] m_pData; strcpy(m_pData, str.m_pData); } return *this; **/ /**更好的解法三 先创建一个临时实例,再交换临时实例和原来的实例**/ if( this != &str) { //先创建一个临时实例 CMyString temp(str); //临时变量(相当于变量交换时临时变量) char* pTemp = temp.m_pData; //(1)把临时实例中的数放到一个新生成的临时变量中去; temp.m_pData = m_pData; //(2)把当前实例的数放到临时实例中去了。 m_pData = pTemp; // (3)把临时变量的数再赋给当前实例,从而完成当前实例与临时实例的交换 } return *this; } int main() { char* test = "hello world!"; CMyString str1(test); CMyString str2; str2 = str1; str1.print(); str2.print(); cout<<"---------------------------"<<endl; char* test2 = "zbhzbn"; CMyString str3(test2); str3 = str3; str3.print(); str3.print(); system("pause"); return 0; }