一 . 關(guān)于類型轉(zhuǎn)換
1. conversion function (轉(zhuǎn)換函數(shù)) —— “轉(zhuǎn)出去”
- 類型轉(zhuǎn)換函數(shù)的一般形式如下:
operator *type*() const;
- 類型轉(zhuǎn)換函數(shù)的特點(diǎn):
- 必須是類的成員函數(shù)簿盅;
- 形參列表必須為空;
- 不能聲明返回類型;
- 類型轉(zhuǎn)換函數(shù)通常應(yīng)該是 const
- 如果需要剔桨,可以寫多個(gè)類型轉(zhuǎn)換函數(shù)
3.參考案例:
operator double() const {
return (double) (m_numerator / m_denominator) ;
}
2. non-explicit-one-argument ctor —— “轉(zhuǎn)回來(lái)”
- one-argument 不是 one-parameter. .
- 能通過(guò)一個(gè)實(shí)參調(diào)用的構(gòu)造函數(shù)定義了一條從構(gòu)造函數(shù)的參數(shù)類型向類類型隱式轉(zhuǎn)換的規(guī)則,
- 參考案例:
public :
Fraction (int num, int den = 1) : m_num(num), m_den(den) {}
Fraction de = f + 4; //調(diào)用 non-explicit ctor 將 4 轉(zhuǎn)為 Fraction(4,1)
3. explicit-one-argument ctor
- explicit 作為關(guān)鍵字鉴嗤,主要用在構(gòu)造函數(shù)前面盟劫,而且關(guān)鍵字 explicit 只對(duì)一個(gè)實(shí)參的構(gòu)造函數(shù)有效,并且只能在類內(nèi)聲明構(gòu)造函數(shù)時(shí)使用 explicit 關(guān)鍵字商架,在類外定義時(shí)不應(yīng)重復(fù)堰怨,
public : // 這樣就不能自動(dòng)將 4 變?yōu)?4/1
explicit Fraction (int num, int den = 1) : m_num(num), m_den(den) {}
4. 避免有二義性的類型轉(zhuǎn)換
- 當(dāng)類同時(shí)定義了類型轉(zhuǎn)換運(yùn)算符及重載運(yùn)算符時(shí)特別容易產(chǎn)生二義性,
- 如果我們對(duì)同一個(gè)類既提供了轉(zhuǎn)換目標(biāo)時(shí)算術(shù)類型的類型轉(zhuǎn)換蛇摸,也提供了重載的運(yùn)算符备图,則將會(huì)遇到重載運(yùn)算符與內(nèi)置運(yùn)算符的二義性問(wèn)題。
二 . 關(guān)于 C++ 2.0
1. 了解編譯器對(duì)c++ 2.0 的支持度
- 對(duì)Dev C++ 最簡(jiǎn)單的方法:
#include <iostream>
int main()
{
std::cout << __cplusplus ;
}
2. c++ 2.0 的幾個(gè)新特性
**1. auto **
- 引進(jìn)原因:編譯器常常需要把表達(dá)式的值賦給變量赶袄,因此需要在聲明變量的時(shí)候清楚知道表達(dá)式的類型揽涮,但有時(shí)很難做到,因此引進(jìn) auto 類型說(shuō)明符饿肺,用它讓編譯器替我們區(qū)分析表達(dá)式所屬類型蒋困。
- 因?yàn)闆](méi)有賦值,無(wú)法推斷出是什么類型敬辣,因此 auto 定義的變量必須有初始值雪标。
- 使用 auto 也可以在一條語(yǔ)句中聲明多個(gè)變量零院,但該語(yǔ)句中的所有變量的初始基本數(shù)據(jù)類型必須一致。
**2. ranged_base for **
- 基本理解:range for 這種語(yǔ)句遍歷給定序列中的每個(gè)元素并對(duì)序列中的每個(gè)值執(zhí)行某種操作村刨;
- 語(yǔ)法形式:
for ( declaration : expression){
statement
declaration 聲明一個(gè)變量告抄,給變量將被用于訪問(wèn)序列中的基礎(chǔ)元素;
expession 是一個(gè)對(duì)象烹困, 用于表示一個(gè)序列玄妈,或者說(shuō)是一個(gè)容器。
- 如果要想改變序列中的值髓梅,必須把循環(huán)變量定義成引用類型拟蜻。
3. variadic templates —— 數(shù)量不定的模版參數(shù)
- variadic template 就是一個(gè)接受可變數(shù)目參數(shù)的模板函數(shù)或模板類】荻觯可變數(shù)目的參數(shù)被稱為 parameter packet ;
- 語(yǔ)法:
template <typename T , typename... Args>
void foo (const T& t, const Args& ... rest)
- 當(dāng)我們需要知道包中有多少元素是酝锅,可以使用 sizeof... 運(yùn)算符。
三 . 關(guān)于 templete -- 初識(shí)模版
1. function template --函數(shù)模版
- 一個(gè)函數(shù)模版就是一個(gè)公式奢方,可用來(lái)生成針對(duì)特定類型的函數(shù)版本搔扁;
- 語(yǔ)法:
template <typename T>
模版定義以關(guān)鍵字 template 開(kāi)頭,后跟一個(gè)模版參數(shù)列表蟋字,用<>將以逗號(hào)分隔的一個(gè)或多個(gè)模版參數(shù). - 當(dāng)我們調(diào)用一個(gè)函數(shù)模板時(shí)稿蹲,編譯器用函數(shù)實(shí)參來(lái)為我們推斷函數(shù)實(shí)參--實(shí)參推導(dǎo);
- 在模版參數(shù)列表中鹊奖,class 苛聘, typename 這兩個(gè)關(guān)鍵字的含義相同,可以相互使用忠聚。
2. class template --類模版
- 類模版是用來(lái)生成類的藍(lán)圖的设哗;
- 在設(shè)計(jì) class 時(shí),可以把類型抽出來(lái)允許使用者任意指定两蟀;
- 編譯器不能為類模版推斷模版參數(shù)類型网梢,因此為了使用類模版,我們必須在模版名后的尖括號(hào)中提供額外信息 -- 就是在使用時(shí)指定赂毯;
3. member template --成員模版
- *一個(gè)類(無(wú)論是普通類還是類模版)可以包含本身是模版的成員函數(shù)战虏,這種成員被稱為成員模版。 *
- 其實(shí)就是說(shuō)模版里面的一個(gè)member欢瞪,而它自己本身又是一個(gè)template ;
**4. 關(guān)于模版特化的基礎(chǔ)知識(shí) **
-
模版特化:
- 當(dāng)我們不希望使用模版版本時(shí)活烙,可以定義類或函數(shù)模版的一個(gè)特例化版本;
- 一個(gè)特例化版本就是模版的一個(gè)獨(dú)立的定義遣鼓,在其中一個(gè)或多個(gè)模版參數(shù)被指定為特定的類型啸盏。
模版偏特化 (partial specialization) -- 部分特例化:
偏特化的模版參數(shù)列表是原始模版的參數(shù)列表的一個(gè)子集或者是一個(gè)特例化版本。
我們可以只特化成員函數(shù)而不是特例化整個(gè)模版骑祟。
模版總結(jié): 學(xué)習(xí)基礎(chǔ)知識(shí)為第五周做準(zhǔn)備
四 . 本周課程疑問(wèn)
- 關(guān)于 pointer-like , function-like 不是很懂回懦,以后慢慢學(xué)習(xí)气笙。