高品質C++/C編程指南-第9章-類的建構函式、解構函式與賦值函數(4)

類String的賦值函數比建構函式複雜得多,分四步實現:(1)第一步,檢查自賦值。你可能會認為多此一舉,難道有人會愚蠢到寫出 a = a 這樣的自指派陳述式!的確不會。但是間接的自賦值仍有可能出現,例如// 內容自賦值b = a;…c = b;…a = c; // 地址自賦值b = &a;…a =

高品質C++/C編程指南-第9章-類的建構函式、解構函式與賦值函數(3)

9.3 構造和析構的次序構造從類層次的最根處開始,在每一層中,首先調用基類的建構函式,然後調用成員對象的建構函式。析構則嚴格按照與構造相反的次序執行,該次序是唯一的,否則編譯器將無法自動執行析構過程。一個有趣的現象是,成員對象初始化的次序完全不受它們在初始化表中次序的影響,只由成員對象在類中聲明的次序決定。這是因為類的聲明是唯一的,而類的建構函式可以有多個,因此會有多個不同次序的初始化表。如果成員對象按照初始化表的次序進行構造,這將導致解構函式無法得到唯一的逆序。[Eckel, p260-261

高品質C++/C編程指南-第9章-類的建構函式、解構函式與賦值函數(2)

9.2 建構函式的初始化表建構函式有個特殊的初始化方式叫“初始設定式表”(簡稱初始化表)。初始化表位於函數參數表之後,卻在函數體 {} 之前。這說明該表裡的初始化工作發生在函數體內的任何代碼被執行之前。建構函式初始化表的使用規則:u 如果類存在繼承關係,衍生類別必須在其初始化表裡調用基類的建構函式。例如class A{…A(int x); // A的建構函式}; class B : public A{…B(int x, int y);//

高品質C++/C編程指南-第9章-類的建構函式、解構函式與賦值函數(1)

建構函式、解構函式與賦值函數是每個類最基本的函數。它們太普通以致讓人容易麻痹大意,其實這些貌似簡單的函數就象沒有頂蓋的下水道那樣危險。 每個類只有一個解構函式和一個賦值函數,但可以有多個建構函式(包含一個拷貝建構函式,其它的稱為普通建構函式)。對於任意一個類A,如果不想編寫上述函數,C++編譯器將自動為A產生四個預設的函數,如A(void); // 預設的無參數建構函式A(const A &a); // 預設的拷貝建構函式~A(void); // 預設的解構函式A &

高品質C++/C編程指南-第8章-C++函數的進階特性(4)

8.3 參數的預設值有一些參數的值在每次函數調用時都相同,書寫這樣的語句會使人厭煩。C++語言採用參數的預設值使書寫變得簡潔(在編譯時間,預設值由編譯器自動插入)。參數預設值的使用規則:l 【規則8-3-1】參數預設值只能出現在函數的聲明中,而不能出現在定義體中。例如:void Foo(int x=0, int y=0); // 正確,預設值出現在函數的聲明中void Foo(int x=0, int y=0) //

高品質C++/C編程指南-第8章-C++函數的進階特性(3)

8.2.2 令人迷惑的隱藏規則本來僅僅區別重載與覆蓋並不算困難,但是C++的隱藏規則使問題複雜性陡然增加。這裡“隱藏”是指衍生類別的函數屏蔽了與其同名的基類函數,規則如下:(1)如果衍生類別的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。(2)如果衍生類別的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。樣本程式8-2-2(a)中:(1

高品質C++/C編程指南-第8章-C++函數的進階特性(2)

8.1.3 當心隱式類型轉換導致重載函數產生二義性樣本8-1-3中,第一個output函數的參數是int類型,第二個output函數的參數是float類型。由於數字本身沒有類型,將數字當作參數時將自動進行類型轉換(稱為隱式類型轉換)。語句output(0.5)將產生編譯錯誤,因為編譯器不知道該將0.5轉換成int還是float類型的參數。隱式類型轉換在很多地方可以簡化程式的書寫,但是也可能留下隱患。# include <iostream.h>void output( int x);

高品質C++/C編程指南-第8章-C++函數的進階特性(1)

對比於C語言的函數,C++增加了重載(overloaded)、內聯(inline)、const和virtual四種新機制。其中重載和內聯機制既可用於全域函數也可用於類的成員函數,const與virtual機制僅用於類的成員函數。 重載和內聯肯定有其好處才會被C++語言採納,但是不可以當成免費的午餐而濫用。本章將探究重載和內聯的優點與局限性,說明什麼情況下應該採用、不該採用以及要警惕錯用。8.1 函數重載的概念8.1.1

高品質C++/C編程指南-第7章-記憶體管理(7)

7.11 new/delete 的使用要點運算子new使用起來要比函數malloc簡單得多,例如:int *p1 = (int *)malloc(sizeof(int) * length);int *p2 = new int[length];這是因為new內建了sizeof、類型轉換和型別安全檢查功能。對於非內部資料類型的對象而言,new在建立動態對象的同時完成了初始化工作。如果對象有多個建構函式,那麼new的語句也可以有多種形式。例如class Obj{public :Obj(void); /

高品質C++/C編程指南-第7章-記憶體管理(6)

7.10 malloc/free 的使用要點函數malloc的原型如下:void * malloc(size_t size);用malloc申請一塊長度為length的整數類型的記憶體,程式如下:int *p = (int *) malloc(sizeof(int) * length);我們應當把注意力集中在兩個要素上:“類型轉換”和“sizeof”。u malloc傳回值的類型是void

高品質C++/C編程指南-第7章-記憶體管理(5)

7.9 記憶體耗盡怎麼辦?如果在申請動態記憶體時找不到足夠大的記憶體塊,malloc和new將返回NULL指標,宣告記憶體申請失敗。通常有三種方式處理“記憶體耗盡”問題。(1)判斷指標是否為NULL,如果是則馬上用return語句終止本函數。例如:void Func(void){A *a = new A;if(a == NULL){return;}…}(2)判斷指標是否為NULL,如果是則馬上用exit(1)終止整個程式的運行。例如:void

高品質C++/C編程指南-第7章-記憶體管理(4)

7.5 free和delete把指標怎麼啦?7.7 杜絕“野指標”“野指標”不是NULL指標,是指向“垃圾”記憶體的指標。人們一般不會錯用NULL指標,因為用if語句很容易判斷。但是“野指標”是很危險的,if語句對它不起作用。

高品質C++/C編程指南-第7章-記憶體管理(3)

7.3.3 計算記憶體容量用運算子sizeof可以計算出數組的容量(位元組數)。樣本7-3-3(a)中,sizeof(a)的值是12(注意別忘了’\0’)。指標p指向a,但是sizeof(p)的值卻是4。這是因為sizeof(p)得到的是一個指標變數的位元組數,相當於sizeof(char*),而不是p所指的記憶體容量。C++/C語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。注意當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指標。樣本7-3-3

高品質C++/C編程指南-第7章-記憶體管理(2)

7.3.1 修改內容樣本7-3-1中,字元數組a的容量是6個字元,其內容為hello\0。a的內容可以改變,如a[0]= ‘X’。指標p指向常量字串“world”(位於靜態儲存區,內容為world\0),常量字串的內容是不可以被修改的。從文法上看,編譯器並不覺得語句p[0]= ‘X’有什麼不妥,但是該語句企圖修改常量字串的內容而導致運行錯誤。char a[] = “hello”;a[0] =

高品質C++/C編程指南-第7章-記憶體管理(1)

歡迎進入記憶體這片雷區。偉大的Bill Gates 曾經失言: 640K ought to be enough for everybody — Bill Gates 1981程式員們經常編寫記憶體管理程式,往往提心弔膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷並且排除它們,躲是躲不了的。本章的內容比一般教科書的要深入得多,讀者需細心閱讀,做到真正地通曉記憶體管理。7.1記憶體配置方式記憶體配置方式有三種:(1)

C++類的設計習慣及標頭檔重複包含問題的解決

在設計一個類的時候,通常是將類的定義及類成員函數的聲明放到標頭檔(即.h檔案)中,將類中成員函數的實現放到源檔案(即.cpp)中。對於animal類需要animal.h和animal.cpp兩個檔案,同樣,對於fish類需要fish.h和fish.cpp。對於main()函數,我們把它單獨放到EX10.cpp檔案中。往一個現有工程添加標頭檔(.h檔案)或源檔案(.cpp檔案)有兩種方式:一種是在開啟的工程中,單擊【File】→【New】,在左邊的Files標籤頁下,選擇C++

C++實現爆炸後的震動效果

在許多遊戲軟體中,我們經常能看到這樣的場面:當某一設施爆炸後,螢幕畫面會伴隨著輕微的震動,使人感到身臨其境。筆者編寫了一個函數void MoveView(int x,int y);通過CRT控制器將螢幕視角左上方座標移至 (x,y)處,使畫面相對移動,從而產生震動效果。程式由Borland C++ 2.0編寫,採用VGA 12H模式,代碼小、速度快、運行效果形象逼。// filename: SHAKE.cpp// maker:

C++ Builder初級調試技術

有很多是可以用調試來看到問題所在.只是初學者不知道有這些東東,即使知道也不是如何去用.我曾經也是這樣.從第一本入門書 BUG 一直困擾自己, 常常用ShowMessage("xxxx");來觀察程式運行現象.因為本人只學過TC 在TC中代碼寫的不很長,程式流程自己很清楚,也就沒去使用TC的調試器,好象它沒有整合的調試器.

c++檔案拷貝

#include<iostream.h>#include<afx.h>void main(){  char SourceName[81];  char DestinName[81];  cout<<"n 請輸入源檔案名稱:";  cin>>SourceName;  cout<<"n 請輸入目標檔案名:";  cin>>DestinName;  try  {    CFile

C/C++誤區五:檢查 new 的傳回值

首先澄清一下,這個誤區僅對 C++ 成立,這裡不過是沿用“C/C++ 誤區”這個銜頭罷了。我們都知道,使用 malloc/calloc 等分配記憶體的函數時,一定要檢查其傳回值是否為“null 指標”(亦即檢查分配記憶體的操作是否成功),這是良好的編程習慣,也是編寫可靠程式所必需的。但是,如果你簡單地把這一招應用到 new 上,那可就不一定正確了。我經常看到類似這樣的代碼:int* p = new int[SIZE];if ( p == 0 ) /

總頁數: 4314 1 .... 2935 2936 2937 2938 2939 .... 4314 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.