1. 程式人生 > >《C++primer(第五版)》學習之路-第十九章:特殊工具與技術

《C++primer(第五版)》學習之路-第十九章:特殊工具與技術

宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:[email protected]

19.1 控制記憶體分配

1.

當我們使用一條new表示式時:

string *sp = new string("a value");

string *arr = new string[10]

實際執行了三步操作。第一部,new表示式呼叫一個名為operator new(或者operator new[])的標準庫函式。該函式分配一塊足夠大的,原始的,未命名的記憶體空間以便儲存特定型別的物件。第二步,編譯器執行相應的建構函式以構造這些物件,併為其傳入初始值。第三部,物件被分配了空間並構造完成,返回一個指向該物件的指標。

2.

當我們使用一條delete表示式刪除一個動態分配記憶體的物件時:

delete sp;

delete [] arr;

實際執行了兩步操作。第一步,對sp所指的物件或者arr所指的陣列中的元素執行對應的解構函式。第二步,編譯器呼叫名為operator delete(或者operator delete[])的標準庫函式釋放記憶體空間。

19.2 執行時型別識別

1.執行時型別識別的功能由兩個運算子實現:

typeid運算子,用於返回表示式的型別

dynamic_cast運算子,用於將基類的指標或引用安全地轉換成派生類的指標或引用

2.

dynamic_cast運算子的使用形式如下表示:

dynamic_cast<type*>(e)

dynamic_cast<type&>(e)

dynamic_cast<type&&>(e)

其中type必須是一個類型別,並且通常情況下該型別應該含有虛擬函式。在第一種形式中,e必須是一個有效的指標;在第二種形式中,e必須是一個左值;在第三種形式中,e不能是左值

e的型別必須符合以下三個條件中的任意一個:e型別是目標type的共有派生類,e的型別是目標type的共有型別或者e的型別就是目標type的型別。如果符合,則型別轉換可以成功,否則,轉換失敗。如果一條dynamic_cast語句的轉換目標是指標型別並且失敗了,則結果為0。如果轉換目標是引用型別並且失敗了,則dynamic_cast運算子將丟擲一個bad_cast異常。

3.

typeid表示式的形式是typeid(e),其中e可以是任意表達式或型別的名字。

19.3 列舉型別

1.

C++包含兩種列舉:限定作用域的和不限定作用域的。

C++11新標準引入了限定作用域的列舉型別。定義限定作用域的列舉型別的一般形式是:首先是關鍵字enum class(或者等價地使用enmu struct),隨後是列舉型別名字以及花括號括起來的以逗號分隔的列舉成員列表。

定義不限定作用域的列舉型別時聖諾掉關鍵字class,列舉型別的名字是可選的。

2.

在C++11新標準中,我們可以在enum的名字後加上冒號以及我們想在改enum中使用的型別。如果我們沒有指定enum的潛在型別,則預設情況下限定作用域的enum成員型別是int。

19.4 類成員指標

1.成員指標是指可以指向類的非晶態成員的指標。一般情況下,指標指向一個物件,但是成員指標指示的是類的成員,而非類的物件。類的靜態成員不屬於任何物件,因此無需特殊的指向靜態成員的指標,指向靜態成員的指標域普通指標沒有什麼區別。

2.我們必須在*之前新增classname::以標識當前定義的指標可以指向classname的成員。

19.5 巢狀類

1.一個類可以定義在另一個類的內部,前者稱為巢狀類或巢狀型別。

巢狀類是一個獨立的類,與外層類基本沒什麼關係。特別是,外層類的物件和巢狀類的物件是相互獨立的。在巢狀類的物件中不包含外層類定義的成員;類似的,在外層類的物件也不包含任何巢狀類定義的成員。

2.巢狀類在其外層類中定義了一個型別成員。和其他成員類似,該型別的訪問許可權由外層類決定。位於外層類public部分的巢狀類實際上定義了一種可以隨處訪問的型別;位於外層類protected部分的巢狀類定義的型別只能被外層類及其友元和派生類訪問;位於外層類private部分的巢狀類定義的型別只能被外層類的成員和友元訪問。

19.6 union:一種節省空間的類

1.聯合(union)是一種特殊的類,一個union考驗有多個數據成員,但是在任意時刻只有一個數據成員可以有值。當我們給union的某個成員賦值之後,該union的其他成員就變成未定義的狀態了。分配給一個union物件的儲存空間至少要能容納它的最大資料成員。

2.union可以定義包括建構函式和解構函式在內的成員函式。但是由於union既不能繼承自其他類,也不能作為基類使用,所以在union中不能含有虛擬函式。

19.7 區域性類

1.類可以定義在某個函式的內部,我們稱這樣的類為區域性類。區域性類定義的型別只在定義它的作用域內可見。和巢狀類不同,區域性類的成員受到嚴格限制。

19.8 固有的不可移植的特性

1.類可以將其(非靜態)資料成員定義成位域,在一個位域中含有一定數量的二進位制位。當一個程式需要向其他程式或硬體裝置傳遞二進位制資料時,通常會用到位域。

位域的型別必須是整型或列舉型別。因為帶符號位域的行為是由具體實現確定的,所以在通常情況下我們使用無符號型別儲存一個位域。位域的宣告形式實在成員名字之後緊跟一個冒號以及一個常量表達式,該表示式用於指定成員所佔的二進位制位數。

2.取地址運算子(&)不能作用於位域,因此任何指標都無法指向類的位域。

3.當物件的值可能在程式的控制或檢測之外改變時,應該將該物件宣告為volatile。關鍵字volatile告訴編譯器不應對這樣的物件進行優化。

4.C++使用連結指示指出任意非C++函式所用的語言。

5.連結指示可以有兩種形式:單個的或符合的。連結指示不能出現在類定義或函式定義的內部。同樣的連結指示必須在函式的每個宣告中都出現。

相關推薦

C++primer()》學習-特殊工具技術

【宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:[email protected]】 19.1 控制記憶體分配 1. 當我們使用一條new表示式時: string *sp

c primer plus()編程練習-編程練習

兩個感嘆號 nal getchar putc 進制 類型 運算 pre 重做 1.編寫一個程序。該程序讀取輸入直到遇到#字符,然後報告讀取的空格數目、讀取的換行符數目以及讀取的所有其他字符數目。 #include<stdio.h> #include<ct

c primer plus()編程練習-編程練習

main tdi blog plus prim span int 統計 rime 1.設計一個程序,統計從輸入到文件結尾為止的字符數。 #include<stdio.h> int main(void){ int ch; int i; i

Hadoop學習)MapReduce框架排序

ati ioe extends 一個用戶 必須 idt 構造 sta gpo 流量統計項目案例 樣本示例 需求 1、 統計每一個用戶(手機號)所耗費的總上行流量、總下行流量,總流量 2、 得出上題結果的基礎之上再加一個需求:將統計結果按照總流量倒序排序 3

Python小白學習)—【檔案操作步驟】【檔案操作模式】

一、檔案操作步驟 step1:開啟檔案,得到檔案控制代碼並賦值給一個變數step2:通過控制代碼對檔案進行操作step3:關閉檔案 舉例: a = open('hello world', 'r', encoding = 'utf-8') #開啟 ‘hello world’ 檔案,得到檔案控制

opengl學習,文字渲染

當你在圖形計算領域冒險到了一定階段以後你可能會想使用OpenGL來繪製文字。然而,可能與你想象的並不一樣,使用像OpenGL這樣的底層庫來把文字渲染到螢幕上並不是一件簡單的事情。如果你只需要繪製128種不同的字元(Character),那麼事情可能會簡單一些。

Linux 學習一)壓縮歸檔以及RAID

壓縮、解壓縮命令 壓縮格式:gz,bz2,xz,zip,Z 壓縮演算法不同,壓縮比(壓縮後的大小-壓縮前的大小/壓縮前的大小)可能也會不同。 compress:FILENAME.Z uncompress 只能壓縮檔案,預設會刪除原檔案保留壓縮後文件: gzip

Linux 學習一)RAID和LVM

傳輸速度 Mb/8=MB 硬碟的介面: IDE(ATA):133Mbps 並行匯流排 SATA:300Mbps,600Mbps,6Gbps 序列匯流排 USB:USB3.0:480Mbps 序列匯流排 SCSI:Small Computer System Int

OpenCV探索六)圖像矯正技術深入探討

double gb2 教科書 長方形 strong fine open lines 導致 剛進入實驗室導師就交給我一個任務,就是讓我設計算法給圖像進行矯正。哎呀,我不太會圖像這塊啊,不過還是接下來了,硬著頭皮開幹吧! 那什麽是圖像的矯正呢?舉個例子就好明白了。 我的好朋友小

“全棧2019”Java抽象類抽象方法詳解

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第五十九章:抽象類與抽象方法詳解 下一章 “全棧2019”Java第六十章:如何定義介面

C++primer()》學習-IO庫

【宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:[email protected]】 8.1 IO類 1. istream(輸入流)型別,提供輸入操作 ostream(輸出

C++primer()》學習-模板泛型程式設計

【宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:[email protected]】 16.1 定義模板 1.模板定義以關鍵字template開始,後跟一個模板引數列表,這是一個逗號分隔的一個或多個模板引數的列表,用小於號(<)和大於號(&

C++primer()》學習-用於大型程式的工具

【宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:libi[email protected]】 18.1 異常處理 1.異常處理機制允許程式中獨立開發的部分能夠在執行時就出現

c++ primer----學習筆記()Ⅱ

部分習題解答: 19.1、19.2: #include <iostream> #include <cstdlib> using namespace std; void *operator new(size_t size) { cout << "new(

c++ primer----學習筆記()Ⅰ

文章目錄 ==特殊工具與技術== 1.控制記憶體分配 1.1 過載new和delete 1.2 定位new表示式 2. 執行時型別識別 2.1 dynamic_cast運算子 2.2 typeid運算子

c++primer----學習筆記(八)Ⅱ

部分習題解答: 18.1: (a)range_error (b)exception 如果寫成throw p,則丟擲指標,是錯誤的18.2: 發生異常,所在塊之前的臨時變數都會被銷燬,v呼叫vector類的解構函式進行銷燬,並釋放相關記憶體;p指標會被銷燬,但p指向的記憶體是動態分配的,所以該記憶

c++ primer----學習筆記(八)Ⅰ

用於大型程式的工具:異常處理、名稱空間和多重繼承 特殊要求: 在獨立開發的子系統之間協同處理錯誤的能力 使用各種庫(可能包含獨立開發的庫)進行協同開發的能力 對比較複雜的應用概念建模的能力 1.異常處理: 異常處理機制允許程式中獨立開發的部分能夠在執行

c++ primer----學習筆記(十三)Ⅰ

知識點: 拷貝控制操作:拷貝、移動、賦值和銷燬 在定義一個類時,我們可以顯式或隱式的定義在此型別的物件拷貝、賦值、移動、銷燬是做什麼,主要通過五種特殊的成員函式來完成這些操作:拷貝建構函式、拷貝複製運算子、移動建構函式、移動複製運算子和解構函式 1.拷貝建構函式: 定

c++ primer----學習筆記()Ⅰ

oop的核心思想是多型性。我們把具有繼承關係的多個型別稱為多型型別; 引用或指標的靜態型別與動態型別不同這一事實正是c++語言支援多型性的根本存在 當且僅當對通過指標或引用呼叫虛擬函式時,才會在執行時解析該呼叫,也只有在這種情況下物件的動態型別才有可能與靜態型別不同 一個派生類的函式如果覆蓋了某個繼承而來

c++ primer----學習筆記(六)Ⅱ

部分習題解答: 16.1: 當呼叫template時,編譯器使用實參的型別來確定繫結到模板引數T的型別,之後編譯器利用推斷出的模板引數來例項化一個特定版本的函式 16.2: #ifndef COMPARE_H #define COMPARE_H template &