1. 程式人生 > 實用技巧 >32.C++-11版本推薦使用using定義別名(替代typedef)虛擬函式之建構函式與解構函式分析

32.C++-11版本推薦使用using定義別名(替代typedef)虛擬函式之建構函式與解構函式分析

大家都知道,在 C++中可以通過 typedef 重定義一個型別:

typedef unsigned int uint_t;

被重定義的型別並不是一個新的型別,僅僅只是原有的型別取了一個新的名字。

但是不能用於模版別名,所以C++11版本推薦,通過using來代替typedef

示例如下所示:

template<typename T>
class Test
{
public:
    Test()
    {
        std::cout << "A " << typeid(T).name() << std::endl;
    }
};

template 
<typename T> using Using_T = Test<T>; //template <typename T> //typedef Test<T> Typedef_T; //取消遮蔽後,這裡將報錯,不能用於模版別名,提示: a typedef cannot be a template int main(int argc, char *argv[]) { Test<int> a1; Using_T<int> a2; // C<int> a3; //這裡會報錯 return
0; }

除此之外,typedef還有個缺點,就是重定義函式指標時,會增加程式碼的閱讀難度

比如:

typedef void (Typdf_ii)(int, int);       //宣告函式
typedef void (*PTypdf_ii)(int, int);      //宣告函式指標
typedef void (*PTypdf_iiArr[3])(int, int);   //宣告函式指標陣列
對應的using用法則是:
using Using_ii = void (int, int);    //宣告函式指標
using PUsing_ii = void (*)(int, int);    //
宣告函式指標 using PUsing_iiArr = void (*[3])(int, int); //宣告函式指標陣列
可以看到使用using, 通過賦值來定義別名,和我們平時使用變數類似,所以閱讀比 typedef 更加清晰
示例如下所示:
#include <iostream>
using namespace std;
 
typedef void (Typdf_ii)(int, int);       //宣告函式
typedef void (*PTypdf_ii)(int, int);      //宣告函式指標
typedef void (*PTypdf_iiArr[3])(int, int);   //宣告函式指標陣列
 
using Using_ii = void (int, int);    //宣告函式指標
using PUsing_ii = void (*)(int, int);    //宣告函式指標
using PUsing_iiArr = void (*[3])(int, int);    //宣告函式指標陣列
 
void func1(int i, int j)
{
    cout<<"func1:"<<i<<","<<j<<endl;
}
 
void func2(int i, int j)
{
    cout<<"func2:"<<i<<","<<j<<endl;
}
void func3(int i, int j)
{
    cout<<"func3:"<<i<<","<<j<<endl;
}
 
int main(int argc, char *argv[])
{ 
    PTypdf_iiArr pTypedf={func1,func2,func3};
 
    PUsing_iiArr pUsing={func1,func2,func3};
 
    pTypedf[0](1,2);        //呼叫func1函式
    pUsing[1](2,3);          //呼叫func2函式
 
    return 0;
}