【C++ primer學習】2.5 處理類型

1、類型別名

兩種方式:

第一種、使用關鍵字typedef 

typedef double wages;    //wages是double的同義詞
typedef wages *p;    //p是double*的同義詞

第二種、使用別名聲明(alias declaration)

using SI=Sales_items;    // SI是Sales_item的同義詞
include<iostream>
using namespace std;

int main()
{
    //第一種:typedef關鍵字
    typedef double *p;//p是double*的同義詞
    //第二種:別名聲明,把等號左側的名字規定成等號右側的別名。
    using wages=double;//wages是double的別名
    wages hourly,weekly;

    hourly=1;
    p point=&hourly;
    cout<<hourly<<endl ;
    cout<<"hourly的地址是——>"<<point;
    return 0;
}

指針、常量和類別別名:

如果某個類別別名是複合類型或常量,在聲明時應該注意。

p

typedef char *pstring;    //pstring是char*的別名
const pstring cstr=0;    //cstr是指向char的常量指針
const pstring *ps;    //ps是一個指針,它的對象是指向char的常量指針

pstring的實際類型是指向char的指針,因此const pstring就是指向char的常量指針,而不是指向常量字符的指針。

不能通過替換成本來的樣子來判斷,是常量指針或是指向常量的指針。

const char *cstr=0; 

const pstring cstr=0;

並不等價。使用pstring時,基本數據類型是指針。用char* 重寫後,數據類型就變成了char,*成了聲明符的一部分。前者聲明瞭一個指向char常量的指針。

 

2、auto類型說明符

編程時,常常要求在聲明變量的時候指定表達式的類型,然而這麼做並不容易。C++11新標準引入了auto類型說明符,它能讓編譯器替我們去分析表達式的所屬類型。

auto讓編譯器通過初始值來判斷變量的類型,所以auto定義的變量必須有初始值

注意,使用auto可以在一條語句中聲明多個變量。但是一條聲明語句只能有一個基本數據類型,所以該語句中所有變量的初始基本數據類型必須一致。

auto i=0,*p=&i;    //正確:i是整數,p是整型指針
auto sz=0,pi=3.14;    //錯誤:sz和pi類型不一致

符合類型、常量和auto

auto一般會忽略頂層const,同時底層const則會保留下來。

int i=0;
const int ci=i, &cr=ci;
auto  b=ci;    //b是一個整數,ci的頂層const特性被忽略掉了
auto e=&ci;    //e是一個指向整形常量的指針,對常量對象取地址是一種底層const

3、decltype類型指示符

decltype,它的作用是選擇並返回操作數的數據類型。希望從表達式的類型推斷出要定義的變量的類型,但不想用該表達式的值初始化變量。

(1)使用的表達式是一個變量:返回變量的類型(包括頂層const和引用在內)問題:是否包括底層const呢。

(2)使用的表達式不是一個變量:返回表達式結果對應的類型

注意:

一、如果表達式的內容是解引用操作,則decltype將得到引用類型。

二、decltype((variable))的結果永遠是引用。

decltype(variable)結果只有當variable本身就是一個引用時纔是引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章