自己实现一个C++的String类

下面的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;
}

发布了182 篇原创文章 · 获赞 71 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104119542