C++Primer讀書筆記完
- 動態型別:面向物件程式設計在執行時確定型別,泛型程式設計在編譯時獲知型別
- 模版:泛型程式設計基礎,一個建立類或函式的藍圖,適用於編譯時才確定類和函式型別的情況
- 模板定義:以template開始,後跟尖括號包圍的模板引數列表,內含一個或多個由逗號分隔的模板引數
- 例項化函式模板:呼叫模板時,隱式或顯示的指明模板實參,例項化出一個特定版本的稱為例項的函式
- 模板引數:型別引數可看作型別說明符,跟在class或typename關鍵字之後;非型別引數表是一個值,通過特定型別名指定,可以是常量表達式的整型,或具有靜態生存期的指標或引用
- 泛型程式碼原則:儘量減少對實參型別的要求,函式引數是const引用,條件判斷僅用<比較運算
- 模板編譯:由於例項化時需要掌握函式模版和類模版成員函式的定義,其定義通常也放在標頭檔案中,與普通函式和普通類成員函式不同
- 例項化類模板:必須提供顯式模板實參,每種元素型別生成的各個例項類之間無關聯,擁有各自的static成員
- 類模版成員函式:定義在類外需用template開始,後跟類模版引數列表;例項化了的類模板,其成員只有在用到時才例項化
- 類模板和友元:非模板友元被授權訪問所有類模板例項,模板友元可根據宣告訪問特定例項或所有例項
- 模板類型別名:不能用typedef引用模板,新標準可使用using定義別名,如template <typename T> using partNo = pair<T, unsigned>; parNode<string> books; partNo<Student> kids;
- 模板引數作用域:在模板內不能重用模板引數名,正常的名字隱藏規則依舊適用;用作用域運算子訪問類的型別成員時,需在句首加typename關鍵字,否則會被預設為static成員
- 預設模板實參:就標準只允許類模板有預設實參,新標允許函式模板也有預設實參;呼叫類模板時必須加上尖括號,即使所有引數都有預設值
- 成員模板:無論普通類還模板類中,本身是模板的成員函式叫成員模板,不能是虛擬函式;在類模板外定義成員模板,必須同時為兩者提供模板引數列表
- 顯式例項化:避免相同模板引數產生多個例項導致的額外開銷;可用extern多次宣告例項,但必須有且僅有一次定義;編譯器會例項化該類的所有成員,所以顯式例項化提供的型別必須能用於所有成員
- 智慧指標的刪除器:shared_ptr儲存刪除器指標,方便執行時傳遞可呼叫物件重置;unique_ptr中包含顯式例項化的刪除器成員,避免間接呼叫刪除器時的執行開銷
- 型別引數轉換:通常不轉換而是生成一個新的模板例項;有限可用的轉換規則包括const轉換和陣列或函式指標轉換;非模板型別引數正常轉換
- 顯式模板實參:在函式之後,實參列表前用尖括號提供顯式實參;只有尾部的顯式模板實參,並且可從函式引數推斷出來的時候,才可忽略;顯式指定的實參可正常型別轉換
- 尾置返回型別:需要根據傳入的引數確定返回型別時,可通過decltype推斷形參作為返回型別,使用尾置返回型別格式返回
- 標準庫型別轉換模板:定義在標頭檔案type_traits中,每個模板有一個公有成員type用於轉換,不能轉換時則返回模板引數型別本身;如remove_reference可將T&、T&&、T轉換為T
- 函式指標:用函式模板初始化函式指標時,根據指標的型別推斷模板實參;使用顯式模板實參消除二義性
- 引用摺疊:間接建立引用的引用,除右值引用的右值引用摺疊為右值引用,其他3種引用的引用都摺疊為左值引用
- 右值引用形參:可傳給它任意型別的實參,若傳引用也不改變左/右值屬性;通常用於模板轉發實參或模板過載;使用右值引用的函式模板通常過載繫結非const右值引用或const左值引用
- 轉發:函式引數指向模板型別引數的右值引用,可保持對應實參的const屬性和左/右值屬性;進一步為解決接受右值引用引數不被理解為左值的問題,使用utility標頭檔案中定義的forward,返回顯式實參的右值引用,可保持實參型別的所有細節
- 函式模版匹配:候選函式包括所有模板實參推斷生成的例項,模板和非模板的可行函式統一按型別轉換排序,多個函式同樣好則順次選擇唯一的非模板函式、無非模板函式時最特例化的模板函式,否則呼叫有歧義
- 可變引數模板:接受可變數目引數的模板函式或模板類;class...、typename...、type-name...指定引數包,之後跟零個或多個引數,用sizeof...(args)獲取引數個數;如template <typename… Args> void foo(const Args& … args)中,Args是模板引數包,args是函式引數包
- 可變引數函式模板:可變引數函式通常是遞迴的,非可變引數版本的宣告必須在作用域內,否則無限遞迴
- 包擴充套件:將一個包分解為多個元素,並對每個元素應用模式,通過在模式後新增省略號觸發
- 轉發引數包:引數定義為右值引用foo(Args&&… args),轉發時應用forward模式bar(std::forward<Args>(args)…)
- 函式模板特例化:必須為每個模板函式提供實參,關鍵字template後跟一對空的尖括號;特例化的本質是例項化,而非過載,因此不影響函式匹配
- 特例化與作用域:所有同名模板的宣告應放在同一標頭檔案的前面,在該檔案內再接著宣告這些模板的特例化版本。
- 類模板特例化:若不指定全部引數部分特例化,則得到的是模板,所以要先定義模板引數;也可以事先只特例化特定成員函式,之後呼叫相同型別時則會呼叫該特例化函式而非重新例項化該成員函式
- 無序容器與特例化:無序容器會組合使用關鍵字型別對應的特例化hash版本,和關鍵字型別上的相等運算子
相關推薦
C++Primer讀書筆記完
動態型別:面向物件程式設計在執行時確定型別,泛型程式設計在編譯時獲知型別 模版:泛型程式設計基礎,一個建立類或函式的藍圖,適用於編譯時才確定類和函式型別的情況 模板定義:以template開始,後跟尖括號包圍的模板引數列表,內含一個或多個由逗號分隔的模板引數 例項化函式模板:呼叫模板時,隱式或顯示的指明模板實
**C++變數和基本內建型別**(C++ Primer讀書筆記)
1.內建型別包括算數型別和空型別(void,適用於沒有任何返回值的函式或者其他的特殊場合)。算數型別包括整形(字元和布林型)和浮點型。 2.除了布林型和擴充套件的字元型之外。,其餘的整形都可以通過在前面新增unsigned來變成無符號型別(帶符號的型別可以表示負數,0,和整數。無符號型別
C++ primer 讀書筆記 9.2 容器庫概覽
模板類 list<int> deque<double> 也可以定義容器的容器, vector<string> vector<vector<string>> 迭代器 迭代器範圍 [begin, end)
C++ primer讀書筆記 7.4 類的作用域
一個類就是一個作用域,在類的外部,成員的名字被隱藏起來了 在類的外部定義成員函式時, 要加上類名和作用域運算子 而一旦遇到了類名,定義的剩餘部分在就在類的作用域之內了。包含引數列表和函式體 另一方面,函式的返回型別通常出現在函式名之前,因此如果返回類型別,需要明確指出哪個類定義了該
C++ primer 讀書筆記 第七章 02 訪問控制和封裝
在c++中,我們使用訪問說明符加強類的封裝性: 定義在public說明符之後的成員在整個程式內可被訪問,public成員是暴露在外的,決定了類的介面 定義在private說明符之後的成員可以被類的成員函式訪問,但不能被使用該類的程式碼訪問,private封裝了類的實現細節 一
C++ primer 讀書筆記 第七章 01 定義抽象資料型別
定義成員函式 成員函式的宣告必須在類的內部,它的定義既可以在類的內部也可以在類的外部。 struct Sales_data { std::string isbn() const { return bookNo; } double arv_price() co
C++ primer 讀書筆記 第七章 06 類的靜態成員
在成員的宣告之前加上static關鍵字即可宣告靜態成員 靜態成員的訪問 使用作用域運算子直接訪問 通過類的物件訪問 Account::rate(); Account ac1; Account *ac2 = &ac1; r = a
C++Primer讀書筆記十——泛型演算法.md
概述 在前一篇我們介紹了容器的基本概念以及使用其成員函式進行增刪改查,但有的時候我們還希望對容器進行更多的操作,比如:查詢特定元素,替換元素等。而標準庫並未給出此類成員函式, 此時需要引入algorithm標頭檔案,其中定義了一系列的操作演算法。 這些演算法不直
C++ primer讀書筆記 chapter3 標準庫型別
除第二章介紹的是C++的基本型別,本章將大致介紹一下C++定義的內容豐富的抽象資料庫型別標準庫。著重介紹一下sting、vector和bitset。 3.2標準庫string型別 1.string型別支援幾個建構函式。建構函式是一個特殊成員函式,定義如何初始化該型別的物件,以下是stri
C++ primer 讀書筆記四
第六章 函式 傳入引用引數 吐槽:c++ primer 這本書感覺不行,關於很多概念講不清 同時代碼存在不具備連續以及調測性 #include "a.hpp" #i
c++ primer讀書筆記170119
重看了一遍第一章 問題1:c++中針對內建型別已經進行變數定義未初始化時的變數值處理。是否設定預設值? ①. 全域性變數編譯器會賦初值,區域性變數則需要自己初始化,否則編譯器報錯; ②. 全域性變數整型賦值系統賦初值為0,其他數值型別(float、lon
C++Primer讀書筆記
第1章 開始 1、C++程式 程式原始檔的名字,一般包括兩部分:檔名以及檔案字尾。檔案字尾一般用來標識檔案的內容 標頭檔案:一般以.h字尾結尾 程式文字檔案:C++一般以.cpp字尾結尾 C++標準庫中的名字都是在一個稱作std 的名字空間中宣告的,這些名字在我
C++ Primer 讀書筆記
1,命令編譯生成的預設輸出檔案(可執行檔案) 命名為:a.out(Unix), a.exe(Windows) 2,cout輸出首先會存到快取中,而printf之類的輸出會直接輸出到輸出流中。 3,可以從鍵盤上輸入End-Of-File:Ctrl+d(Unix), Ct
C++ Primer 讀書筆記2.1
1、C++中認為:void修飾返回值表示:不返回任何值;void修飾引數表列,表示:不接受任何引數、若引數表列裡什麼也不寫,表示:可接受任意型別的引數。 2、C++中規定short <= int <= long <= long long 3、注意隱式型別轉
C++ primer 讀書筆記二
第三章字串 向量 陣列 string 初始化 初始化型別:拷貝初始化、直接初始化 使用=初始化即為,拷貝初始化。 char 陣列與string char 陣列如果沒有\0截止
C++Primer讀書筆記(二)
10.無符號數不會小於0 注意不能將帶符號型別和無符號型別混合使用。11.變數宣告與定義的關係 extern int i;//宣告i而非定義i(只宣告不定義用extern) int j;//宣告並定義j extern int i=1;//定義(賦值操作抵消了e
C++primer讀書筆記(一)
1.endl操縱符 效果:結束當前行,並將與裝置關聯的緩衝區(buffer)中的內容刷到裝置中。緩衝重新整理操作可以保證到目前為止程式所產生的所有輸出都真正寫入輸出流中,而不是僅停留在記憶體中等待寫入輸入流。//在除錯時新增列印語句,這類語句應該保證“一直”重新整理流。否則
[C/C++] C++ Primer學習筆記
轉義 寫到 十六進制 程序 結果 否則 筆記 end 情況 下面記錄我每天看書學到的以前不太清楚的概念和用法: Day 1 endl:具有輸出換行的效果,並刷新與設備相關聯的緩沖區。 註:在調試程序過程中插入的輸出語句都應刷新輸出流,否則可能會造成程序崩潰,將會導致程序出錯
C++ Primer 學習筆記_5_變量和基本類型(續2)
key 情況 boa 類和對象 類定義 優點 splay 查看 變量定義 變量和基本類型 七、枚舉 枚舉不但定義了整數常量集,並且還把它們聚集成組。 枚舉與簡單的const常量相比孰優孰劣, 通過以下一段代
《Programming in C》讀書筆記
pro 標準 編譯 常量 第七章 自己的 編程錯誤 基礎 結構體使用 該書由美國Seephen G.Kochan著 賈洪峰譯,電子工業出版社,來源是九江學院圖書館采購,現在藏於九江學院圖書館逸夫樓。 本書的主要內容: 第一章、基礎知識 第二章、編譯和運行第一