剑指offer:面试题1 赋值运算符函数

<pre name="code" class="cpp">//定义一个字符串类 重载赋值运算符(剑指offer:面试题一 赋值运算符函数)


#include <string>
class MyString
{
public:
	//在类内部声明带参构造函数
	MyString(char* pData = NULL);
	//在类内部声明赋值构造函数
	MyString(const MyString& str);
	//在类内部声明析构函数
	~MyString();

	//重载等号运算符  即赋值函数
	MyString& operator = (const MyString &str);
	//在类内部申明打印函数
	void print();
private:
	char* mData;

};

//在类外定义带参构造函数
MyString::MyString(char* pData)
{
	if (pData == NULL)
	{
		mData = new char[1];
		mData[0] = '\0';
	}
	else{
	
		int length = strlen(pData);
		mData = new char[length + 1];
		strcpy_s(mData, strlen(pData) + 1, pData);
	}
}

//在类外定义复制构造函数
MyString::MyString(const MyString& str)
{
	int length = strlen(str.mData);
	mData = new char[length + 1];
	strcpy_s(mData, strlen(str.mData) + 1, str.mData);
}
//在类外定义析构函数
MyString::~MyString(){
	delete mData;
}
/*
//在类外定义赋值函数
MyString& MyString::operator = (const MyString& str)
{
	if (this == &str)
		return *this;
	delete mData;
	mData = NULL;
	int length = strlen(str.mData);
	mData = new char[length + 1];
	strcpy_s(mData, strlen(str.mData)+1,str.mData);
	return *this;
}*/
/*
	上面的赋值函数存在一些程序崩溃的隐患,书中也给出了一个解决方法:
	先创建一个临时实例,再交换临时实例和原来的实例。
	实现代码如下:
	*/
	MyString& MyString::operator =(const MyString &str){
		if(this != &str){
			MyString Tempstr(str);
			char* temp = Tempstr.mData;
			Tempstr.mData = mData;
			mData = temp;
		}
		return *this;
	}

//在类外定义打印函数
void MyString::print(){
	printf("%s \n",mData);
}


/**********************测试代码*****************/
void test1()
{
	char* text = "hello world!";
	MyString str1(text);
	MyString str2;
	//调用赋值函数
	str2 = str1;
	str2.print();
}
void test2()
{
	char* text = "hello world!";
	MyString str1(text);
	//调用赋值构造函数
	MyString str2(str1);
	str2.print();
}
void test3()
{
	char* text = "hello world!";
	MyString str1(text);
	MyString str2;
	MyString str3;
	//调用赋值函数
	str3= str2 = str1;
	str2.print();
	str3.print();
}
void main()
{
	//test1();
	//test2();
	test3();
}


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值