[英]C++ Explicit declaration triggers a warning in the default constructor
在Code::Blocks v13.12
項目中,我有一個名為Drawable
的類,該類具有一個稱為rotation
的浮點成員變量。
我注意到,在Drawable
的默認構造函數中明確聲明rotation
會觸發以下警告:
'Drawable :: rotation'應該在成員初始化列表中初始化[-Weffc ++]
但是,在其定義旁邊明確聲明rotation
並不能做到這一點。
我想知道的是,為什么這樣做:
Drawable() {
rotation = 0.f;
}
給我一個成員初始化警告,同時:
class Drawable
{
...
float rotation = 0.f;
...
}
和這個:
Drawable() : rotation(0.f) {}
編譯時沒有抱怨?
-Weffc ++警告的描述如下:
警告Scott Meyers的Effective C ++系列書籍中的以下樣式准則有違:
- 為具有動態分配的內存的類定義一個復制構造函數和一個賦值運算符。
- 在構造函數中,初始化優先於賦值。
- 讓operator =返回對* this的引用。
- 當您必須返回對象時,請勿嘗試返回引用。
- 區分增量和減量運算符的前綴和后綴形式。
- 切勿重載&&,||或.。
您所看到的警告已包含在第4項中: 確保在使用 Effective C ++ 3rd Edition時 對對象進行了初始化,並說( 釋義 ):
C ++規則規定,在輸入構造函數的主體之前,必須初始化對象的數據成員。
和:
編寫構造函數的更好方法是使用成員初始化列表而不是賦值構造函數產生相同的最終結果,但是通常會更高效。
和( 強調我的措辭 ):
基於賦值的版本首先調用默認構造函數以初始化成員變量,然后在默認構造的變量之上迅速分配新值。 因此,浪費了那些默認構造中執行的所有工作。 成員初始化列表方法避免了該問題,
在C ++ 11 中 ,如果大多數成員變量都具有默認值,則類成員初始化器 ( 也避免了此警告 )可以簡化初始化,一個缺點是直到C ++ 14都使類成為非聚合類 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.