簡體   English   中英

c ++模板構造函數初始化

[英]c++ template constructor initialization

template<class T>
class Node
{
    public:
    Node(Node<T>* next=NULL, T data=T()) : _next(next), _data(data)
    {
    } 
    Node<T>* _next;
    T _data;
};

我是c ++模板的新手。 對於默認參數, T data = T()是標准方法嗎? 也許T data = 0也可以嗎?

這不是“構造函數初始化”,這是一個默認參數。 它允許調用者提供比函數少的參數,未指定的參數將采用默認值。

另一種方法是:

template<class T>
class Node
{
    public:
    Node(Node<T>* next, T data) : m_next(next), m_data(data) {} 
    Node(Node<T>* next) : m_next(next), m_data() {} 
    Node(void) : m_next(NULL), m_data() {} 

    Node<T>* m_next;
    T m_data;
};

如果允許使用少於兩個參數,則調用不同的構造函數(具有幾乎相同的行為)。

使用單獨的重載有許多優點:

  • 如果始終省略data參數,則不需要copy-constructor。
  • 如果始終提供data參數,則不需要默認構造函數。

這與構造函數無關; 你所看到的是默認函數參數和值初始化的組合。

后者在C ++ 03標准§8.5/ 5中描述:

對值類型T的對象進行值初始化意味着:

  • 如果T是具有用戶聲明的構造函數(12.1)的類類型(第9節),則調用T的默認構造函數(如果T沒有可訪問的默認構造函數,則初始化是錯誤的);
  • 如果T是沒有用戶聲明的構造函數的非聯合類類型,那么T的每個非靜態數據成員和基類組件都是值初始化的;
  • 如果T是數組類型,那么每個元素都是值初始化的;
  • 否則,該對象被零初始化

零初始化T類型的對象意味着:

  • 如果T是標量類型(3.9),則將對象設置為0(零)轉換為T的值;
  • 如果T是非聯合類類型,則每個非靜態數據成員和每個基類子對象都是零初始化的;
  • 如果T是聯合類型,則對象的第一個命名數據成員89)是零初始化的;
  • 如果T是數組類型,則每個元素都是零初始化的;
  • 如果T是引用類型,則不執行初始化。

最后,將它拼湊在一起,§8.5/ 7:

初始值為空集括號的對象,即(),應進行值初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM