利用」
引用計數」和
」寫時複製
」這兩個特點來實現乙個字串類
,為了更好地隱藏類的實現
,避免出現下述情況
:當對於內聯函式定義的改動
,對於物件成員大小的改動等導致程式的重新編譯
,我們可以的**結構如下:
我們在程式中維護兩個不同的標頭檔案
,在提供給使用者使用的那個公共標頭檔案中
,只是告訴使用者我們定義了
string_ref
這個類,
並且在string
物件中用乙個指標指向它
#ifndef string_h
#define
string_h
#include
<
iostream
>
using
namespace
std;
#include
<
assert.h
>
class
string_ref;
//前向宣告**類
////
string類宣告
////
簡單的引用計數型字串類
class
string
;#endif
另乙個標頭檔案string_priv.h
是乙個私有的標頭檔案
,我們並不需要將其分發給使用者
,它裡面包含了對
string_ref
類的完整宣告
: 其對應的實現檔案
string_priv.cpp:
#include
"string_priv.h"//
//string_ref實現區
//string_ref::string_ref(
const
char
*cp):count(
0),length(0)
string_ref::
~string_ref()
string_ref::string_ref(
const
string_ref
&rhs):count(0)
const
string_ref
&string_ref::
operator=(
const
string_ref
&rhs)
return
*this;}
char
string_ref::
operator
(int
index)
const
intstring_ref::length()
const
void
string_ref::addref()
void
string_ref::decref()
}void
string_ref::init(
const
char
*cp)
void
string_ref::release()
const
char
*string_ref::getdata()
const
////
string實現區
//string::string(
const
char
*cp):proxy(
newstring_ref(cp))
string::
~string()
string::string(
const
string
&s):proxy(s.proxy)
const
string
&string::
operator=(
const
string&s)
return
*this;}
void
string::tolower()
assert(proxy
->
count==1
);//
驗證自己是建立者
//小寫化
for(
char*cp
=proxy
->
data;
*cp;
++cp)
}char
string::
operator
(int
index)
const
intstring::length()
const
ostream
&operator
<<
(ostream
&out
,const
string
&rhs)
////
string_ref類宣告
//#include
"string.h
"class
string_ref
;
測試**:#include
"string.h
"int
main()
引用計數型String類的簡單實現
利用 引用計數 和 寫時複製 這兩個特點來實現乙個字串類,為了更好地隱藏類的實現,避免出現下述情況 當對於內聯函式定義的改動,對於物件成員大小的改動等導致程式的重新編譯,我們可以的 結構如下 我們在程式中維護兩個不同的標頭檔案,在提供給使用者使用的那個公共標頭檔案中,只是告訴使用者我們定義了stri...
引用計數型String類的簡單實現
利用 引用計數 和 寫時複製 這兩個特點來實現乙個字串類,為了更好地隱藏類的實現,避免出現下述情況 當對於內聯函式定義的改動,對於物件成員大小的改動等導致程式的重新編譯,我們可以的 結構如下 我們在程式中維護兩個不同的標頭檔案,在提供給使用者使用的那個公共標頭檔案中,只是告訴使用者我們定義了stri...
String類的引用計數的淺拷貝
引用計數的淺拷貝的兩種實現方式 方法一 string類中採用char str和int prefcount 但利用指標 prefcount重新開闢空間存放引用計數,會產生大量記憶體碎片。如下 includeusing namespace std includeclass string string c...