高品質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編程指南-第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編程指南-第6章-函數設計(3)

對於相加函數,應當用“值傳遞”的方式返回String對象。如果改用“引用傳遞”,那麼函數傳回值是一個指向局部對象temp的“引用”。由於temp在函數結束時被自動銷毀,將導致返回的“引用”無效。例如:c = a + b; 此時 a + b 並不返回期望值,c什麼也得不到,流下了隱患。6.3

高品質C++/C編程指南-第6章-函數設計(2)

由於c是char類型,取值範圍是[-128,127],如果宏EOF的值在char的取值範圍之外,那麼if語句將總是失敗,這種“危險”人們一般哪裡料得到!導致本例錯誤的責任並不在使用者,是函數getchar誤導了使用者。l 【規則6-2-3】不要將正常值和錯誤標誌混在一起返回。正常值用輸出參數獲得,而錯誤標誌用return語句返回。回顧上例,C標準庫函數的設計者為什麼要將getchar聲明為令人迷糊的int類型呢?他會那麼傻嗎?在正常情況下,getchar的確返回單個字元。

高品質C++/C編程指南-第6章-函數設計(1)

函數是C++/C程式的準系統單元,其重要性不言而喻。函數設計的細微缺點很容易導致該函數被錯用,所以光使函數的功能正確是不夠的。本章重點論述函數的介面設計和內部實現的一些規則。 函數介面的兩個要素是參數和傳回值。C語言中,函數的參數和傳回值的傳遞方式有兩種:值傳遞(pass by value)和指標傳遞(pass by pointer)。C++ 語言中多了引用傳遞(pass by reference)。由於引用傳遞的性質象指標傳遞,而使用方式卻象值傳遞,初學者常常迷惑不解,容易引起混亂,請先閱讀6

高品質C++/C編程指南-第3章-命名規則(1)

第3章 命名規則比較著名的命名規則當推Microsoft公司的“匈牙利”法,該命名規則的主要思想是“在變數和函數名中加入首碼以增進人們對程式的理解”。例如所有的字元變數均以ch為首碼,若是指標變數則追加首碼p。如果一個變數由ppch開頭,則表明它是指向字元指標的指標。 “匈牙利”法最大的缺點是煩瑣,例如int i, j, k; float x, y, z;倘若採用“匈牙利”命名規則,則應當寫成int

高品質C++/C編程指南-第2章-程式的版式

第2章 程式的版式 版式雖然不會影響程式的功能,但會影響可讀性。程式的版式追求清晰、美觀,是程式風格的重要構成因素。 可以把程式的版式比喻為“書法”。好的“書法”可讓人對程式一目瞭然,看得興緻勃勃。差的程式“書法”如螃蟹爬行,讓人看得索然無味,更令維護者煩惱有加。請程式員們學習程式的“書法”,彌補大學電腦教育的漏洞,實在很有必要。 2.1 空行

C++ POCO庫中文編程參考指南(2) 基礎資料型別 (Elementary Data Type)(Poco/Types.h)

基本類型在Poco/Types.h標頭檔中。以下以 GNU C/C++ 和 CLang 為例。不 過要強調的是,POCO 有極好的跨平台性,你能想到的平台,幾乎都可以運行 POCO。1 有符號整型typedef signed char            Int8;typedef signed short           Int16;typedef signed int

C++ POCO庫中文編程參考指南(1) 總覽

1 What is POCO?POCO 是什嗎?這是我最常被人問到的。POCO 是 POrtable COmponents 的縮寫,官方首頁:POCOProject.org。是一個非常出色的 C++ 庫,相當於 Java 的 Class Library、.NET 的 Framework 和 Apple 的 Cocoa。它與 Boost 是非常不同的,簡單說 Boost 就是相當於 Advanced STL。2 本系列文章所使用的 POCO 版本POCO C++ Library 1.4.3p1 (

C++學習摘要之八:模板

模板(template)利用一種完全通用的方法來設計函數或類而不必預先說明將被使用的每個對象的類 型,利用模板功能可以構造相關的函數或類的系列,因此模板也可稱為參數化類別型。在C++語言中,模 板可分為類模板(class template)和函數模板(function template)。在程式中說明了一個函 數模板後,編譯系統發現有一個相應的函數調用時,將根據實參中的類型來確認是否匹配函數模板中對應 的形參,然後產生一個重載函數。該重載函數的定義體與函數模板的函數定義體相同,稱之為模板函數(

C++學習摘要之四:虛函數和多態

多態性與前面提到的資料封裝和繼承性共同構成了物件導向程式設計的三個重要機制。1.靜態聯編與動態聯編由於函數重載的存在,當程式中出現調用同名函數時,編譯器會根據函數的參數類型、個數決定調用 執行哪一個同名函數的代碼,這種把一個函數的調用與適當的函數實現代碼聯絡在一起的過程,叫做聯編 。根據聯編的實現階段的不同,可將其分為靜態聯編和動態聯編兩種。靜態聯編是在程式編譯階段確定一個函數調用與函數實現代碼間的對應關係,這種對應關係確定下來

C/C++誤區四:char c = getchar();

許多初學者都習慣用 char 型變數接收 getchar、getc,fgetc 等函數的返 回值,其實這麼做是不對的,並且隱含著足以致命的錯誤。getchar 等函數的返 回實值型別都是 int 型,當這些函數讀取出錯或者讀完檔案後,會返回 EOF.EOF 是一個宏,標準規定它的值必須是一個 int 型的負數常量。通常編譯器都會把 EOF 定義為 -1.問題就出在這裡,使用 char 型變數接收 getchar 等函數的返 回值會導致對 EOF 的辨認出錯,或者錯把好的資料誤認為是

C/C++誤區三:強制轉換 malloc() 的傳回值

首先要說的是,使用 malloc 函數,請包含 stdlib.h(C++ 中是 cstdlib) ,而不是 malloc.h .因為 malloc.h 從來沒有在 C 或者 C++ 標準中出現過! 因此並非所有編譯器都有 malloc.h 這個標頭檔。但是所有的 C 編譯器都應該 有 stdlib.h 這個標頭檔。在 C++ 中,強制轉換 malloc() 的傳回值 是必須的,否則不能通過編譯。但是在 C 中,這種強制轉換卻是多餘的,並且 不利於代碼維護。起初,C 沒有 void 指標,那時

高品質C++/C編程指南-第11章-其它編程經驗(2)

11.1.3 const成員函數任何不會修改資料成員的函數都應該聲明為const類型。如果在編寫const成員函數時,不慎修改了資料成員,或者調用了其它非const成員函數,編譯器將指出錯誤,這無疑會提高程式的健壯性。以下程式中,類stack的成員函數GetCount僅用於計數,從邏輯上講GetCount應當為const函數。編譯器將指出GetCount函數中的錯誤。class Stack{public:void Push(int elem);int Pop(void);int

高品質C++/C編程指南-第11章-其它編程經驗(1)

11.1 使用const提高函數的健壯性看到const關鍵字,C++程式員首先想到的可能是const常量。這可不是良好的條件反射。如果只知道用const定義常量,那麼相當於把火藥僅用於製作鞭炮。const更大的魅力是它可以修飾函數的參數、傳回值,甚至函數的定義體。 const是constant的縮寫,“恒定不變”的意思。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。所以很多C++程式設計書籍建議:“Use const

總頁數: 4314 1 .... 4084 4085 4086 4087 4088 .... 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.