巢狀類和運算子過載

2021-09-02 22:35:05 字數 3920 閱讀 2714

這篇部落格主要是學習c++程式語言第10章和第11章內容的**,主要有巢狀類和運算子過載。在編寫**時候也發現很多的問題,順便也記錄一下。

**檔案包括string.h檔案,string.cpp檔案及main.cpp檔案。主要做的就是模仿實現string.h的功能。當然了,功能和效率肯定沒法和string相比了。主要涉及三個類和乙個結構體。

string.h檔案:

#includeclass string

~srep()

srep* get_own_copy()//需要時轉殖

void assign(int nsz,const char* p)

strcpy(s,p);

} };

srep* rep;

public:

class cref

public:

operator char() const

void operator= (char c)

};class range{}; //用於異常

string(); //x = ""

string(const char*); //x = "abc"

string(const string&);//x = other_string

string& operator= (const char*);

string& operator= (const string&);

~string();

void check(int) const;

char read(int) const;

void write(int,char);

cref operator (int);

char operator (int i) const;

int size() const;

string& operator+=(const string& x);

string& operator+=(const char* s);

friend string operator+(const string& x1,const string& x2)

friend string operator+(const string& x1,const char* s)

friend std::ostream& operator<

friend std::istream& operator>>(std::istream& in,string& x)

delete stmp;

return in;

} friend bool operator==(const string&x,const string&y)

friend bool operator==(const string&x,const char* s)

friend bool operator!=(const string&x,const string&y)

friend bool operator!=(const string&x,const char* s)

};

string.cpp檔案:

#include"string.h"

#includestring::string() //以空串為預設值

string::string(const string& x) //複製建構函式

string::~string()

string& string::operator= (const string& x) //複製賦值

//偽裝的複製運算以const char* 作為引數,以提供字串文字量

string::string(const char* s)

string& string::operator= (const char* s)

return *this;

}void string::check(int i) const

char string::read(int i) const

void string::write(int i,char c)

string::cref string::operator (int i)

char string::operator (int i) const

int string::size() const

string& string::operator+=(const string& x)

delete stmp;

return *this;

}string& string::operator+=(const char* s)

delete stmp;

return *this;

}

main.cpp檔案:

#include"string.h"

#include#includestring f(string a,string b)

初看可能感覺不到什麼問題,但是細想就能發現問題所在。string的物件x中成員變數s是使用new申請的記憶體,但這裡卻沒有考慮變數s記憶體是否足夠的問題。結合main中**就能把問題看透,main的**如:

string x,y;

std::cin>>x>>y;

第一句,會使用string的無引數的建構函式建立物件x和y,而在這個無引數建構函式完成之前會呼叫srep的建構函式,為變數x.rep->s申請記憶體空間,檢視srep的建構函式會發現這次申請的空間是1。第二句,會呼叫》運算子過載,也就上面運算子過載**。當使用這輸入任意大小的字串時,x.rep->s的空間都是不夠的。

所以,在使用new申請空間的變數時,一定需要知道它的記憶體空間的大小,以確保會夠用。

3.使用strcat()和strcpy()的問題

其實就是strcat()的問題。strcat(char* s1,char* s2)是合併兩個字串,並把結果存放在s1上;strcpy(char* s1,char* s2)是把s2的字串拷貝到s1上,會覆蓋s1原本的字元的。先看下面的**塊:

char* sc1 = new char[5];

char* sc2 = new char[5];

strcat(sc1,"abc");

strcpy(sc2,"abc");

執行這四行**後,期望是sc1="abc",sc2="abc",單結果卻不是這樣的除錯結果如下:

可以看到sc1的結果並不是所期望的,也很明顯sc1的記憶體不夠用了。也就不難理解下面的**為什麼會出錯了。

string& string::operator+=(const string& x)

delete stmp;

return *this;

}

4.運算子過載全域性定義和定義成成員函式問題起初我按照書上的在string.h檔案定義,如下:

#includeclass string;

friend string operator+(const string& x1,const string& x2)

friend string operator+(const string& x1,const char* s)

專案在編譯過程中會出現這兩個 + 運算子過載多次定義的錯誤,原因是string.h檔案會被其他檔案include,會被多次編譯。其解決方法有很多,可以使用inline或者extern(有些編譯器可能也會有問題)。我使用的是將它變成類的友元函式。

類和物件 運算子過載 3 遞增運算子過載

作用 通過過載遞增運算子,實現自己的整型資料 include include using namespace std 自定義整型 class myinteger 過載前置 運算子 myinteger operator 返回引用為了一直對乙個資料進行遞增操作 過載後置 運算子 myinteger op...

運算子類過載

類過載格式 函式型別 operator 運算子名稱 形參表 型引數 使用引數 1 使用 號實現複數相加 不使用類過載 include using namespace std class complex complex double r,double i complex complex add com...

運算子過載 類的賦值運算子過載

下面介紹類的賦值運算子 1.c 中物件的記憶體分配方式 在c 中,物件的例項在編譯的時候,就需要為其分配記憶體大小,因此,系統都是在stack上為其分配記憶體的。這一點和c 完全不同!千 萬記住 在c 中,所有類都是reference type,要建立類的實體,必須通過new在heap上為其分配空間...