下面的String函数目前只含有创建和输出功能,后续会更新…
// 2020年1月30日 星期四 21:59:30
#include <iostream>
using namespace std;
class String {
public:
String (const char *cstr = ""); // 0等价于""
String (const String &str); // 拷贝构造
String &operator = (const String &str);
// 析构函数
~String();
// 返回指针
char *get_c_str() const {
return m_data;
}
private:
char *m_data; // 定义个指针
};
// String s("Happy");
inline String::String(const char *cstr) {
if (cstr) { // 给定初值,如"Hello"
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
} else { // 未指定初值
m_data = new char[1]; // 分配一块内存,来放'\0'
*m_data = '\0';
}
}
// 支持:String s2(s1);
inline String::String(const String &str) {
m_data = new char[strlen(str.m_data) + 1]; // 友元类
strcpy(m_data, str.m_data);
}
// 支持:s3 = s2;
inline String &String::operator = (const String &str) { // 成员函数形式重载运算符
// 检查自我赋值
if (this == &str) return *this;
// 清空原来m_data所指的动态空间
delete[] m_data;
// new申请一个同样大的空间
m_data = new char[strlen(str.m_data) + 1];
// strcpy复制内容到new出来的空间
strcpy(m_data, str.m_data);
return *this; // 返回修改过的调用对象
}
inline String::~String() {
delete[] m_data; // 释放由m_data指向的动态空间
}
// 非成员函数形式定义 支持:cout << str;
inline ostream &operator << (ostream &out, const String &str) {
out << str.get_c_str();
return out;
}
int main() {
String s; // s = ""
String s1 = "Amazing!"; // 类特殊初始化
// 等价于String s1("Amazing");
String s2("Hello");
String s3(s1); // 拷贝构造
cout << s3 << endl; // 第一个<<已重新定义
s3 = s2; // 拷贝赋值
cout << s3 << endl;
return 0;
}