- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十一章类别和动态记忆体配置
第十一章 類別和動態記憶體配置
這章主要討論如何在類別中使用 new 和 delete 及如何處理動態記憶體所產生的
一些問題,主題似乎很少,但這些主題會影響建構函數及解構函數的設計以及運算
子的多型。
先看一個特別的例子。若要產生一個類別,其成員表示姓名,最簡單的方法是
用字元陣列儲存。但其缺點是字元陣列的長度該設多少呢? 若為 14 個字元的陣列,
遇到 Barthlomew Smeadsbury-Crafthovingham 時就不夠了,為安全起見,改用40 個字元
的陣列,但若產生2000 個此種物件的陣列,因很多字元陣列只用去部分記憶體空間,
所以浪費了很多空間。還好我們可以利用new 運算子來動態地配置正確的記憶體空間。
動態記憶體配置和類別
對記憶體配置,C++ 採用的策略是:在程式所需要的記憶體大小,是在執行期
決定而非編譯期。C++ 使用 new 和 delete 來取得記憶體的動態控制權,很不幸的,
在類別中使用這些運算子會產生一些新的程式設計問題,接下來就來討論這些問題。
靜態的類別成員及其範例
在看 new 和delete 的範例前,先介紹String 類別中新的儲存類型:靜態類別成員。
這類別會存一個指向字串的指標和一個表示字串長度的值。為了能從 String 類別來
看 new ,delete 及靜態類別成員是如何運作,所以在建構函數和解構函數被呼叫時將
顯示一些訊息。範例程式 11-1 是類別宣告,取名為 strng1.h 是為了避免和標準的函
數檔string.h 產生衝突。
C++ Primer Plus 5/e 中文精華版
範例程式 11-1 strng1.h
// strng1.h -- string class definition
#ifndef _STRNG1_H_
#define _STRNG1_H_
class String
{
private:
char *str; // pointer to string
int len; // length of string
static int num_strings; // number of objects
public:
String(const char * s); // constructor
String(); // default constructor
~String(); // destructor
// friend function
friend ostream operator(ostream os, const String st);
};
#endif
此宣告中要注意兩件事。首先 str 的資料型態是用 char 指標而非 char 陣列,代
表在類別宣告時並未配置空間予字串,而須在建構函數中利用 new 為字串配置空
間,如此才能避免受限於事先定義的字串大小。
第二,定義成員 num_strings 為靜態的儲存類別。此類別有一特殊性質,不管產
生多少個物件,程式只產生一個靜態類別的變數,意思是靜態成員為該類別的所有
物件所共用,好比全家人共用一個電話號碼。假設產生了 10 個 String 物件,分別有
10 個 str 及 len ,但只有一個共用的num_strings ,如圖11-1 所示。num_strings 記錄此
程式產生的物件個數。
範例程式 11-2 為類別 String 的實作。
範例程式 11-2 string1.cpp
// strngs1.cpp -- String
原创力文档


文档评论(0)