(9)處理型別

2021-07-24 05:28:57 字數 2280 閱讀 9559

型別別名:是乙個名字,它是某種型別的同義詞。

c++有兩種方法用於定義型別別名:

一.使用關鍵字typedef:

typedef  int iname;

iname a =1 ; //可用iname定義變數 ,a是乙個整型變數

二.使用別名宣告(using)來定義型別的別名:

using iname = int;

iname a =1;

使用型別別名有很多好處,它讓複雜的型別名字變得簡單明瞭,易於理解和使用,還有助於程式設計師清楚的知道使用該型別的真實目的。

如果某個型別別名指代的是復合型別或者常量,那麼把它用到宣告語句裡會產生意想不到的結果。例如:

typedef char* pstring;

const pstring cstr = 0; //cstr是指向char的常量指標

const pstring *ps; //ps是乙個指標,它的物件是指向char的常量指標。

到這裡會有很多人把常量指標和常量的指標搞混,我在前一節也指出了兩者的區別,現在我來解釋一下為什麼上面是乙個常量指標,而不是乙個常量的指標。其實理解這個不難,型別別名就是起了另乙個名字實際東西並沒有改變,所以有人習慣的去把char *帶入到const pstring cstr = 0;這個語句去理解,得到的是乙個指向char常量的指標,這是大錯特錯!起了別名你就需要把他們當做乙個整體來看,pstring = char *.pstring就是乙個指向字元的指標。前面加了const,const修飾的是這個指標,所以是乙個常量指標。但是如果把char * 帶進去,const修飾的是char,所以是乙個指向char的常量的指標。

auto型別說明符:

給變數賦初值或賦值時,我們都需要知道變數的型別,避免型別不匹配。但是這在實際程式設計中會引起不少的麻煩事。為了解決這個問題

c++引入了auto型別說明符,用它就能讓編譯器替我們去分析表示式所屬的型別。

因為auto讓編譯器通過初始值來推算變數的型別,所以auto定義的變數必須有初始值。如:

auto i= 1;

auto a= 1,b =3.14; //錯誤,變數列表的型別必須一致

auto與復合型別、常量:

一.如果auto初始值是個引用,編譯器以引用物件的型別auto的型別。

二.auto一般會忽略到頂層const,同時底層的const則會保留下來.

int  i=0,&r = i;

const int ci = i,&cr= ci;

auto b = ci; //b是整數

auto c = cr; //c是整數

auto d = &i; //d是整數指標

auto e = &ci; //e是指向整數常量的指標

三.如果希望推斷出來的auto型別是乙個頂層的const,需要明確指出

const auto f = ci;   //推演的ci是int f是const  int

decltype型別指示符

有時候會遇到這種情況:希望從表示式的型別推斷出要定義變數的型別,但不想用該表示式的值初始化變數。這時候需要用到decltype,它的作用是選擇並返回運算元的型別。如:

decltype(f()) sum =x;	//sum的型別就是函式f()的型別
編譯器不呼叫函式f,而是使用當呼叫發生時f的返回型別作為sum的型別。

decltype處理頂層const和引用與auto不同,如果decltype使用的表示式是乙個變數,則decltype返回該變數的型別(包括頂層const和引用在內):

const	int  ci = 0,&cj = ci;

decltype(ci) x = 0; //x的型別是const int

decltype(cj) y =x; //y的型別是const int&,y繫結到變數x

注意:引用從來都是作為所指物件的同義詞出現,只有在decltype處是乙個例外。

想得到引用指向物件的型別,可以將引用作為表示式的一部分如:cj+0,顯然這個表示式的結果將是乙個具體值而非乙個引用。

如果表示式的內容是解引用操作,則decltype將得到引用型別,因為解引用指標可以得到指標所指的物件,而且還能給這個物件賦值。

decltype(variable)結果只有當variable本身是個引用時才是引用,而decltype((variable))(兩層或多層括號)的結果永遠是引用

9 處理輸入

遊戲有很多輸入,如鍵盤,滑鼠,手柄等.sdl庫將這些處理變得非常簡單,我們這裡將這幾種輸入統一到一起.這裡不講太多,因為目前我們對輸入的處理就是檢測輸入裝置的狀態,來更新遊戲物件的狀態.看下 就行了,然後對於遊戲中的物件怎麼使用輸入裝置的狀態,自己發揮 inputhandler.h ifndef i...

OSG學習筆記9 處理鍵盤事件

處理鍵盤事件 include stdafx.h include include include includeclass keyboardhandler public osgga guieventhandler 人機互動事件處理器 else else if ea.getkey 2 else if e...

c (13)處理型別 型別別名

型別別名 是乙個名字,它是某種型別的同義詞。使用型別別名的好處 它讓複雜的型別名字變的簡單明瞭,易於理解和使用,還有助於程式設計師清楚的知道使用該型別的真實目的。有兩種方法可以定義型別別名 1.傳統的方法是使用關鍵字typedef typedef double d d是double的同義詞 type...