2016-04-27 28 views
0

當我讀stdC++代碼時,我對下面的代碼感到困惑。 這是一段stl_list.h的代碼。在C++中有「typedef」的任何特殊含義嗎?

template <class _Tp, class _Alloc>          
class _List_base               
    : public _List_alloc_base<_Tp, _Alloc,         
          _Alloc_traits<_Tp, _Alloc>::_S_instanceless> 
{                  
public:                 
    typedef _List_alloc_base<_Tp, _Alloc,         
          _Alloc_traits<_Tp, _Alloc>::_S_instanceless> 
      _Base; /* Is _Base a kind of type?*/        
    typedef typename _Base::allocator_type allocator_type;     

    _List_base(const allocator_type& __a) : _Base(__a) {/* How can a type be initiated like this?*/     
    _M_node = _M_get_node();            
    _M_node->_M_next = _M_node;           
    _M_node->_M_prev = _M_node;           
    } 
}                

讓我困惑的是_Base。該名稱由typedef定義。我認爲這是一種類型。但_Base出現在初始化列表中。 我如何理解這種用法​​?或者,請爲我粘貼一些有用的鏈接。

回答

1

A typedef爲類型聲明瞭一個別名 - 如果您願意,可以使用簡寫。

它的語法是完全一樣的,如果你聲明一個變量,但不是一個變量,它創建指定類型的別名:

int a;   // a is a variable of type int 
typedef int B; // B is an alias for type int 

(請注意,他們往往說typedef original-type alias,但它是一個不正確的規則 - 如果失敗,函數指針,例如 - 這是一個更規則要記住毫無理由地)

至於靜態成員,類型別名作用域 - 類裏面是沒有其他限定訪問,從外面它需要資格(_List_base::_Base)。


來到您的特定情況下,這只是指基類,這是_List_alloc_base<_Tp, _Alloc, _Alloc_traits<_Tp, _Alloc>::_S_instanceless>和將肯定麻煩每次寫完整的簡寫。

它出現在初始化列表中,因爲構造函數調用基類的構造函數 - 即_Base - 傳遞參數__a

這可能是更容易地看到,如果你能以某種方式「放大」的typedef的範圍和寫:

template <class _Tp, class _Alloc>          
class _List_base               
    : public _Base 
{                  
public:                 
    typedef _List_alloc_base<_Tp, _Alloc,         
          _Alloc_traits<_Tp, _Alloc>::_S_instanceless> 
      _Base; 
    typedef typename _Base::allocator_type allocator_type;     

    _List_base(const allocator_type& __a) : _Base(__a) { 
+0

非常好的答案。謝謝。 –

1

它用於基於先前存在的類型定義自定義類型。爲一種類型提供別名,你可以說。 typedef可以被理解爲「定義類型」或「type - def初始化」。

你可以有 「鏈接」 typdef S,即:

typedef int Id;  // Define new type "Id" 
typedef Id UserId; // Define new type "UserId" based on a previously existing type 
// This is possible since "Id" was already defined 

,然後只用它:_Base您使用_List_alloc_base<_Tp, _Alloc, _Alloc_traits<_Tp, _Alloc>::_S_instanceless>

UserId uid = 0; //uid is a variable of type UserId, which is an alias for int 

在你所提供的每一次使用的例子引擎蓋,但以更短的方式。使用該別名會產生更簡潔,更緊湊的代碼塊。

您可能會注意到的例子也在以下行使用typedef typename

typedef typename _Base::allocator_type allocator_type; 

注意_Base可以在該行中使用,因爲它是在上一行已定義。關於typedeftypename的聯合使用,請參閱this question,同樣請閱讀this answer


this link

的公式,遵循的是:需要

typedef [attributes] DataType AliasName;

typedef關鍵字。 屬性不是。 該typedef關鍵字之後可以進行任何C++內置數據類型,包括intshortsignedunsignedcharsigned charunsigned chardoublelong,或long double。數據類型也可以是由C++編譯器附帶的一個庫提供的現有類。例如,它可以是字符串類。數據類型也可以是指向已知類型的指針。

即使這是你會遇到很多次這個關鍵字的定義,它可能是更容易把它當做typedef declaration;如在下面的評論中指出利瑪竇意大利

+0

的'typedef的[屬性]數據類型aliasname的;'是沒有實際意義,而且弄得我沒有盡頭當我最初學習C和C++時,因爲(例如)涉及函數指針的'typedef'在那些假的場所下根本沒有意義。查看'typedef'的正確方法是:'typedef declaration;',其中聲明與您聲明一個變量完全相同,而不是*變量*它爲其類型聲明一個*別名*。 –

+0

感謝您的回答,非常清楚。 –

相關問題