一,目標
此次目的很明顯,實現string類中的主要方法,包括:建構函式,拷貝建構函式,+,+=運算子的過載等。
在實際的面試中,關於string的問題會很多,因此自己實現一遍很有必要。
二,**實現
1,首先看宣告
#pragma once
#include
using
namespace
std;
class mystring
mystring& operator=(const mystring& other); //賦值運算子過載
mystring operator+(const mystring& x);
mystring& operator+=(const mystring& x);
bool
operator==(const mystring& x);
friend ostream& operator
<
~mystring();
private:
char* str;
};
2,具體實現
//如果x==null,則申請乙個位元組用來存放結束符,之所以這樣做,是擔心直接cout乙個null的str
mystring::mystring(const
char* x)
else
}mystring::mystring(const mystring& x)
//這裡之所以要檢測是否自賦值是因為如果不檢測,直接將原始的str清空後,就沒辦法再給自己複製了
//因為它們指向同一塊區域
mystring& mystring::operator=(const mystring& other)
mystring mystring::operator+(const mystring& x)
mystring& mystring::operator+=(const mystring& x)
bool mystring::operator==(const mystring& x)
ostream& operator
<
mystring::~mystring()
3,測試**
void test()
注意以上執行還不會成功,需要加入指令:#pragma warning(disable:4996)
這是因為c++認為strcpy等函式不安全,所以已經選擇棄用,加入這句指令,就是指忽略相應
的警告。
3,執行結果
注意此處的除錯資訊在上面的**中並沒有新增,只是為了測試我的猜想
測試是從z的定義那裡產生的,
3.1,首先呼叫建構函式,用字串給z賦值
3.2 呼叫加號運算子,生成temp的臨時物件,使我不解的是此處為什麼沒有呼叫建構函式呢?
然後呼叫拷貝建構函式生成temp的拷貝物件返回,接著析構temp;
3.3,接著呼叫等號運算子,把這個拷貝物件再賦給z;
3.4,析構z,x,y
4,總結
1,其實還有很多string類的功能沒有實現,以我的理解,只要理解了底層的實現細節,對自己以後使用相應的方法是很有幫助的,畢竟是自己完成過
2,to_str()方法其實就是直接返回 (const char*) str;
3,拷貝建構函式與=建構函式的不同便是,拷貝建構函式是一種特殊的建構函式,所以它是用來初始化乙個物件的,而=運算子則是用來給乙個已經存在的物件重新賦值
4,每個類都提供了預設的建構函式,拷貝建構函式,析構函式,=運算子,之所以還要自己重新定義,這就設計淺拷貝與深拷貝的問題了,關於這點,有興趣的可以自己去了解
string類的實現
參考c primer.string類的實現,清翔兔 06,jan.includeusing namespace std class string string void private char m data inline string string const char str inline st...
String類的實現
學習資料結構寫了乙個string的類,貼出來求指教 ifndef string h h define string h h include include include define defaultsize 128 class string maxsize為傳入引數的string string c...
string類的實現
include using namespace std class string public string const char str 0 普通建構函式 string const string other 拷貝建構函式 string void 析構函式 string operator const...