编写类String的构造函数、析构函数、拷贝构造函数、赋值函数和连接函数
已知类String的原型为:
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operator =(const String &other); // 赋值函数
String operator +(const String &other); //连接函数
private:
char *m_data; // 用于保存字符串
};
请编写String的上述5个函数。
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~String(void); // 析构函数
String& operator= (const String &other); // 赋值函数
String operator+ (const String &other); //连接函数
char* data(){ return m_data; }
private:
char *m_data; // 用于保存字符串
};
String String::operator+ (const String &other) //连接函数,相当于strcat
{
if (other.m_data == NULL)
{
return *this;
}
else
{
if (m_data == NULL)
{
return other;
}
else
{
String str;
int len =strlen(m_data)+strlen(other.m_data)+ 1;
str.m_data = new char[len];
strcpy(str.m_data, this->m_data);
strcat(str.m_data, other.m_data);
return str;
}
}
}
String& String::operator= (const String& other) //赋值函数
{
if (this->m_data == NULL) //先判断自己是否为空
{
if (other.m_data == NULL) //对方是否为空
{
//忽略
}
else
{
int len = strlen(other.m_data) + 1;
m_data = new char[len];
strcpy(m_data, other.m_data);
}
}
else
{
delete[] m_data;
if (other.m_data == NULL)
{
m_data = nullptr;
}
else
{
int len = strlen(other.m_data) + 1;
m_data = new char[len];
strcpy(m_data, other.m_data);
}
}
return *this;
}
String::String(const char* str)
{
if (str == NULL)
{
m_data = NULL;
cout << "nullptr" << endl;
}
else
{
int len = strlen(str) + 1; //+1,因为要加\0,补充:size_t strlen(const char *s);
m_data = new char[len];
strcpy(m_data, str); //把str指向的内容复制到m_data指向的内存里
} //char *strcpy(char *dest, const char *src);
cout << "String构造函数" << endl;
}
String::String(const String& other) //将原有对象中的成员变量的内容逐个复制给新的对象中的成员变量
{
if (other.m_data == NULL)
{
m_data = NULL;
}
else
{
int len = strlen(other.m_data) + 1;
this->m_data = new char[len];
/* for(int i=0;i < len; i++)
{
this->m_data[i] = other.m_data[i];
}
*/
strcpy(m_data, other.m_data); //与上面for循环等价
}
cout << "String 拷贝构造函数" << endl;
}
String::~String()
{
if (m_data != NULL)
{
delete[] m_data;
}
cout << "String 析构函数" << endl;
}
int main(int argc, char* argv[])
{
String str1 = "hello ";
String str2 = "world!";
String str3 = str1 + str2;//str3=str1+(str2);
cout << str3.data() << endl;//输出:hello world!
return 0;
}