从昨天开始,我希望自己能够每天坚持下来。每天一道面试题,每天都有成长。距离找工作的日子越来越近,珍惜现在的学生生活。希望我能坚持下来,好好地努力,找到一个理想的工作。其实,一直在犹豫到底使用哪种语言去做这些题目,现在终于想通了,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;
}