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本身就是一個引用時纔是引用。