簡體   English   中英

奇怪的c ++代碼片段

[英]Weird c++ code snippet

我有這個片段:

template<class T>
class VECTOR_2D 
{
public:
    T x,y;

    VECTOR_2D() 
        :x(T()),y(T())
    {}
}

在構造函數中初始化的x和y是什么?

xy復制初始化T值初始化值。

從C ++ 03標准,§8.5/ 7:

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

從§8.5/ 5開始:

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

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

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

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

x(T()),y(T())可以用x(),y()代替,而不是直接對xy進行初始化。 在大多數情況下,這將實現相同的凈效果(假設T是可復制的),但在某些情況下,這將更有效,因此作為一般規則,這種方法應始終是首選。

T的實例(每個),由該類型的默認構造函數構建

有人沒有意識到你可以像這樣默認初始化:

VECTOR_2D() : x(), y() {};

所以,相反,通過做一些像這樣的事情,他們真的很啰嗦

X x = X();

無意義的副本應該由任何理智的編譯器優化,但它仍然有點愚蠢。

在表達式中使用T()會創建一個類型為T的rvalue並對其進行初始化

如果T有一個默認構造函數,那么構造函數將被調用,如果T是一個聚合類型,那么每個屬性都將被初始化 ,對於基本類型(使用Java意義上的原語 :integer,float,double,char,pointers) ),它們將被設置為0。

暫無
暫無

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

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