首頁 > 軟體

C++類別中如何使用定義的型別別名

2022-11-25 14:00:22

類中使用定義的型別別名

1 typedef定義型別別名

1.1 使用方法

在C++中,typedef關鍵字用來定義型別的別名。

typedef int MYINT;

此時,MYINT是int的別名,可以將MYINT作為資料型別來定義其他變數。

MYINT myint;

其中,myint的型別是MYINT 。

1.2 注意事項

不能使用typedef對型別別名MYINT進行重複定義。

typedef int MYINT;
typedef double MYINT;

此時,編譯器報錯,報錯資訊為“ error C2371: “MYINT”: 重定義;不同的基本類型”。

2 在類中使用typedef定義的型別別名

2.1 使用方法

在類中也可以使用“1 typedef定義型別別名”中定義的int的型別別名MYINT。

class MyClass {
  MYINT i;
};

此時,自定義類MyClass的成員變數i的型別是int。

2.2 注意事項

在類中可以對型別別名MYINT進行重複定義。

typedef int MYINT;
class MyClass {
  MYINT i;
  typedef double MYINT;
  MYINT j;
};

此時,自定義類MyClass的成員變數i的型別是int,而成員變數j的型別是double。

關於型別別名的總結

陣列(本內容摘錄自《C++ Primer 第五版》P205)

typedef int arrt[10];  //arrt是一個型別別名,
                       //它表示的型別是含有10個整數的陣列
using arrt=int[10];       //arrt的等價宣告
arrt* func(int i);       //func返回一個指向含有10個整數的陣列的指標

函數指標形參(本內容摘錄自《C++ Primer 第五版》P222)

/*
*顯式地將形參定義成指向函數的指標
*/
void useBigger(const string &s1, const string &s2,
                bool (*pf)(const string &,const string &));
bool lengthCompare(const string &, const string &);

正如useBigger的宣告語句所示,直接使用函數指標型別作形參顯得冗長而煩瑣。型別別名和decltype能讓我們簡化使用了函數指標的程式碼:

//Func和Func2是函數型別
typedef bool Func(const string &, const string &);
typedef decltype(lengthCompare) Func2;            //等價的型別
//FuncP和FuncP2是指向函數的指標
typedef bool(*Funcp)(const string &, const string &);
typedef decltype(lengthCompare) *FuncP2;        //等價的型別

我們使用typedef定義自己的型別。Func和Func2是函數型別,而FuncP和FuncP2是指標型別。需要注意的是,decltype返回函數型別,此時不會將函數型別自動轉換成指標型別。因為decltype的結果是函數型別,所以只有在結果前面加上*才能得到指標。可以使用如下的形式重新宣告useBigger:

//useBigger的等價宣告,其中使用了型別別名
void useBigger(const string &, const string &, Func);
void useBigger(const string &, const string &, FuncP2);

這兩個宣告語句宣告的是同一個函數,在第一條語句中,編譯器自動地將Func表示的函數型別轉換成指標。

返回指向函數的指標

和陣列類似,雖然不能返回一個函數,但是能返回指向函數型別的指標。然而,我們必須把返回型別寫成指標形式,編譯器不會將函數返回型別當成對應的指標型別處理。與往常一樣,要想宣告一個返回函數指標的函數,最簡單的辦法是使用型別別名:

using F = int(int*, int);        //F是返回型別,不是指標
using PF = int(*)(int*, int);    //PF是指標型別

其中我們使用型別別名將F定義成函數型別,將PF定義成指向函數型別的指標。必須時刻注意的是,和函數型別的形參不一樣,返回型別不會自動地轉換成指標。我們必須顯式地將返回型別指定為指標:

PF f1(int);        //正確:PF是指向函數的指標,f1返回指向函數的指標
F f1(int);        //錯誤:F是函數型別,f1不能返回一個函數
F *f1(int);        //正確:顯式地指定返回型別是指向函數的指標

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com