使用C++的类简单实现string
数据是用指针来存放的,所以就涉及到深浅拷贝的问题。
要能够实现 对象 = 字符串,对象 = 对象 功能,就要重载 = 运算符。写两个重载函数。还要写复制构造函数。都要注意深浅拷贝的问题。
#include <bits/stdc++.h>
using namespace std;
class myString {
private:
char* ch;
public:
// 构造函数
myString (const char* p = nullptr) { // 默认参数是nullptr
if (p == nullptr) {
ch = nullptr;
} else {
ch = new char[1 + strlen(p)];
strcpy_s(ch, 1 + strlen(p), p);
}
}
// 复制构造函数
myString (const myString& temp) {
if (temp.ch == nullptr) {
ch = nullptr;
} else {
ch = new char[1 + strlen(temp.ch)];
strcpy_s(ch, 1 + strlen(temp.ch), temp.ch);
}
}
// 析构函数
~myString () {
if (ch != nullptr) delete []ch;
}
// 重载 = 运算符,实现对象 = 字符串
myString& operator=(const char* p) { // 此处不可以是const char* & p。
if (ch == p) return *this;
if (ch != nullptr) delete []ch;
ch = new char[1 + strlen(p)];
strcpy_s(ch, 1 + strlen(p), p);
}
// 重载 = 运算符,实现对象 = 对象
myString& operator=(const myString& temp) {
if (this == &temp) {
return *this;
} else {
if (ch != nullptr) {
delete []ch;
}
if (temp.ch == nullptr) {
ch = nullptr;
} else {
ch = new char[1 + strlen(temp.ch)];
strcpy_s(ch, 1 + strlen(temp.ch), temp.ch);
}
return *this;
}
}
// 打印成员函数
void show() const {
printf("%s\n", ch);
}
};
int main()
{
myString str1; // 调用构造函数时,使用默认的参数 nullptr
myString str2("hello, world!"); // 调用构造函数时,给出了初始化参数
myString str3(str2); // 调用的是复制构造函数
myString str4;
str4 = "hahaha"; // 调用重载 = 运算符函数,实现 对象 = 字符串
str4 = str2; // 调用重载 = 运算符函数,实现 对象 = 对象
return 0;
}