c++處理類型

一、類型別名

類型別名:把一個(gè)復(fù)雜類型名用通俗易懂的名稱代替。見例子1,特別注意,如果類型別名指代的是復(fù)合類型或者常量,如果不小心就會(huì)出問題,見例子2。

例子1
typedef double wanges;  // double 和 wanges等價(jià)
typedef wanges base, *p; // base 是double等價(jià) , p是double *等價(jià)
wanges a;  //等價(jià)于 double a;
例子2
typeof char *pastring;  // pastring是char *的別名,因此pastring代表的類型是指針
const pastring cstr = 0; // 由于const是修飾給定類型,而pastring是指向char的指針的別名
//因此cstr是指向char的常量指針,而非指向常量字符的指針
const char * cstr = 0; //是對 const pastring cstr = 0的錯(cuò)誤理解

二、auto

auto在c++11引入的,auto讓編譯器自動(dòng)判斷變量的類型,auto也可以在一條語句中聲明多個(gè)變量,但是一條聲明語句只能有一個(gè)基本類型,所以在auto聲明多個(gè)變量的基本類型要一致。auto在推算const和引用變量的時(shí)候會(huì)發(fā)送改變,具體改變見例子3:

 //1、當(dāng)auto推算的引用的時(shí)候會(huì)被忽略掉引用
int i =0, &r = i;
auto a = r;  
//2、auto推算常量時(shí)候,會(huì)忽略頂層const,但會(huì)保留底層const
int i = 100;
const int ci = i, &cr = ci; 
auto b = ci; // b是一個(gè)int (ci的頂層const被忽略)
auto c = cr; // c是一個(gè)int(首先引用推算會(huì)被忽略,cr是ci的別名,而ci本身就是個(gè)頂層const,最后頂層const被忽略)
auto d = &i; //d是一個(gè)int *
auto e = &ci; //e是一個(gè)int const *,ci本身常量,&ci是指向int常量指針,它本身是具有底層const,因此const也就保留了下來
//3、如果程序員需要保留頂層const該咋辦,其實(shí)不難,由于auto推到的類型不包含就加上不就行了
const auto f = ci ; // f是一個(gè)const int
//4、設(shè)置一個(gè)類型auto的引用時(shí)候,初始值的頂層const將被保留
const &m = ci; // m是一個(gè)const int &(常量引用)

課后習(xí)題解析

const int i = 42;
auto j = i; // i 是一個(gè) int
const auto &k = i; //是一個(gè)const int & ,其中這里auto在編譯后會(huì)變成int &
auto *p  = &i; //是一個(gè)const int *,其中這里auto在編譯后會(huì)變成const int *
const auto j2 = i, &k2 = i; //j2 是一個(gè)const int , k2是一個(gè)const int &,其中auto會(huì)變成 int 

三、decltype類型指示符(c++11)

decltype類型推斷指示符:用在我們需要從表達(dá)式判斷變量的類型,同時(shí)又不想要計(jì)算該表達(dá)式的值。見例子

decltype(f()) sum = x; // sum的類型就是函數(shù)f的返回值類型
// 編譯器在指向這個(gè)話的時(shí)候,并不直接調(diào)用f函數(shù),而是直接給sum變量制定f函數(shù)的返回值類型

auto與decltype區(qū)別:
(1) decltype不會(huì)忽略頂層const
(2) decltype的結(jié)果與表達(dá)式形式密切相關(guān),例如加不加括號有著很大的區(qū)別:decltype((variable))的結(jié)果永遠(yuǎn)是引用,decltype(variable)結(jié)果只有當(dāng)variable是引用的時(shí)候是引用。

//(1)
const int ci =  0, &cj = ci;
decltype(ci) x = 0;  // x是一個(gè)const int
decltype(cj) y = x;  // y是一個(gè)const int &
//(2)
int i = 42, *p = &i; &r = i;
decltype(r+0) b ; //b是一個(gè)int,這是由于表達(dá)式的結(jié)果是int決定的
decltype(*p) c; //錯(cuò)誤:c是int &必須初始化,由于*是一個(gè)接指針操作,*p代表了是int &,因此等到的結(jié)果也是int &

課后練習(xí)

int a = 3, b = 4;
decltype(a) c = a;
decltype(a = b) d = a;
d = 1000;
cout << a << " " << b << " " << c << " " << d; // 1000 4 3 1000
//從結(jié)果可知,d是個(gè)int &,由于賦值是會(huì)產(chǎn)生引用的一類表達(dá)式,引用類型是左值的類型,也是就是i是int,則表達(dá)式 i=x的類型是int &

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容