C++面向對象程序設計(二)_string類實現

1.含指針數據類的設計 必須包含 拷貝構造 拷貝賦值,析構
2. &出現在typename的後面,叫做引用,&出現在object的前面,叫做取地址,得到的是指針
3. array new 要搭配array delate
代碼如下:

//
// Created by zlc on 2020/3/29.
//
//含指針數據類的設計 必須包含 拷貝構造 拷貝賦值,析構
#ifndef STRING_MYSTRING_H
#define STRING_MYSTRING_H
//class My_string;
class My_string{
public:
    My_string(const char* cstr =0);//不會改變輸入的字符串,默認指向0
    //拷貝構造
    My_string(const My_string& str);//不會改變這個藍本 加const
    //拷貝賦值
    My_string& operator = (const My_string& str);
    ~My_string();
    char * get_c_str() const { return  m_data;}
private:
    //字符串其實就是字符數組,放指針動態分配大小
    char* m_data;

};

#include <cstring>
My_string::My_string(const char *cstr) {
    if(cstr){
        //字符串是以'/0'結尾
        m_data = new char[strlen(cstr)+1];
        strcpy(m_data, cstr);//將傳進來的內容拷貝到
    }
    else{
        //未指定初值
        m_data = new char[1];
        *m_data = '\0';
    }

}

inline
My_string::~My_string() {
    //array new 對應array delate
    delete [] m_data;
}
//拷貝構造函數
My_string::My_string(const My_string& str) {

    //直接取另一個 object 的 private data.
    // (兄弟之間互為 friend)
    m_data = new char[strlen(str.m_data)+1];
    strcpy(m_data,str.m_data);
}
//拷貝賦值
 My_string& My_string::operator=(const My_string& str){

    //考慮是否是自我賦值,來源端和目的端相同
    //My_string&中 &出現在typename的後面,叫做引用
    //&str中 &出現在object的前面,叫做取地址,得到的是指針
    if(this == &str)
        return *this;

    delete[] m_data;
    m_data = new char[strlen(str.m_data)+1];
    strcpy(m_data,str.m_data);
    //不管是傳出去的是值還是引用,*+指針
    return *this;
}

#include <iostream>
using namespace std;
ostream& operator <<(ostream& os,My_string& str)
{
    return os<< str.get_c_str();
}
#endif //STRING_MYSTRING_H

main 函數:

在這裏插入代碼片
#include <iostream>
#include "myString.h"
int main() {
    My_string s1("hello");
    My_string s3=s1; //拷貝賦值
    My_string s2(s1);//拷貝構造
    std::cout<<s1<<endl<<s2<<endl<<s3<<endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章