這篇部落格主要是學習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上為其分配空間...