string.h
// 2024/5/24/0024.
#ifndef INTERVIEW_STRING_H
#define INTERVIEW_STRING_H
#include <iostream>
namespace yuy {
class string {
public:
string(const char *cstr = nullptr); // 默认构造与传参构造的结合体
~string(); // 析构函数
string(const string &str); // 拷贝构造函数
string &operator=(const string &str); // 拷贝赋值运算符
string(string &&str); // 移动构造函数
string &operator=(string &&str); // 移动赋值运算符(注意返回的是左值引用)
char *c_str() const; // 返回C风格字符串
friend std::ostream &operator<<(std::ostream &os, const string &str); // 重载<<
private:
char *data_;
};
}
#endif //INTERVIEW_STRING_H
string.cpp
// 2024/5/24/0024.
#include "string.h"
#include <cstring>
namespace yuy {
// data_结尾一定是\0,所以需要多申请一个字节
string::string(const char *cstr) {
if(cstr != nullptr) {
data_ = new char[strlen(cstr) + 1];
strcpy(data_, cstr);
} else {
data_ = new char[1];
*data_ = '\0';
}
}
string::~string() {
delete[] data_;
}
string::string(const string &str) {
data_ = new char[strlen(str.data_) + 1]; // 同一个类型的类中,互为友元类,可以访问私有成员
strcpy(data_, str.data_);
}
// 先释放原空间,再申请新空间
string &string::operator=(const string &str) {
if(this != &str) { // 处理自赋值
delete[] data_;
data_ = new char[strlen(str.data_) + 1];
strcpy(data_, str.data_);
}
return *this;
}
string::string(string &&str) {
data_ = str.data_;
str.data_ = nullptr;
}
string &string::operator=(string &&str) {
if(this != &str) { // 处理自赋值
delete[] data_;
data_ = str.data_;
str.data_ = nullptr;
}
return *this;
}
char *string::c_str() const {
return data_;
}
std::ostream &operator<<(std::ostream &os, const string &str) {
os << str.data_;
return os;
}
}