您的位置:首页 > 职场人生

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

2015-09-07 21:36 459 查看
<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();
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息