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;
}