[英]Weird c++ code snippet
我有這個片段:
template<class T>
class VECTOR_2D
{
public:
T x,y;
VECTOR_2D()
:x(T()),y(T())
{}
}
在構造函數中初始化的x和y是什么?
x
和y
被復制初始化為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()
代替,而不是直接對x
和y
進行初始化。 在大多數情況下,這將實現相同的凈效果(假設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.