c++ 构造函数

2024-01-16  本文已影响0人  简书网abc
#include <iostream>
#include <stdio.h>
#include <string.h>
//#include <vector>

using namespace std;

class String {
public:
    String(const char* cStr = 0);   // c风格拷贝构造
    String(const String& str);      // c++风格拷贝构造
    String& operator=(const String& str);   // 拷贝赋值
    ~String();
    char* get_c_str() const { return m_data; }
private:
    char* m_data;
};

// c风格拷贝构造函数, C风格的参数, 拷贝构造
inline
String::String(const char* cStr) {
    if (cStr) {
        this->m_data = new char[strlen(cStr) + 1];
        strcpy(this->m_data, cStr);
    } else {    // 未指定初始值
        this->m_data = new char[1];
        *(this->m_data) = '\0';
    }
}

// c++风格拷贝构造函数, 分配空间,然后整体复制过去.
inline
String::String(const String& str) {
    this->m_data = new char[strlen(str.m_data) + 1];
    strcpy(this->m_data, str.m_data);
}

// 拷贝赋值函数, 经典写法
inline String&
String::operator=(const String& str) {
    if(this == &str) {  // 自我检测..., 防止左右相同时,本身被释放.
        return *this;
    }
    delete[] this->m_data;  // 1,删除自己
    this->m_data = new char[strlen(str.m_data) + 1];    // 2, 分配空间
    strcpy(this->m_data, str.m_data);    // 3, 复制内容
    return *this;
}


// 析构函数
inline
String::~String() {
    delete[] m_data;
}


// 全局函数 << 操作符重载
inline ostream&
operator << (ostream& os, const String& str) {
    os << str.get_c_str();
    return os;
}


int main()
{
    String s1("abc");   // c风格构造函数
    cout << "s1: " << s1 << endl;

    String s2(s1);      // c++风格拷贝构造函数
    cout << "拷贝构造函数s2: " << s2 << endl;

    String s3 = s2; // c++风格拷贝构造函数  // todo 声明并且初始化的时候使用的是拷贝初始化操作
    cout << "初次初始化,拷贝构造函数s3: " << s3 << endl;

    s3 = s1;    // 拷贝赋值函数
    cout << "已经存在的变量, 拷贝赋值函数s3: " << s3 << endl;

    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读