2016-12-22 179 views
1

我有下面的類代碼生成wreorder警告

#include <string> 

class A { 
protected: 
    std::string m1; 
    int port; 

public: 
    std::string m2; 
    A(std::string,std::string,int); 


}; 

A::A(std::string _m1,std::string _m2,int _port) : m1(_m1),m2(_m2),port(_port){ 
} 

int main(int argc, char *argv[]){ 
    A("x","y",argc); 
} 

當用gcc ARM編譯5.40和-Wreorder它輸出

a.cpp: In constructor ‘A::A(std::__cxx11::string, std::__cxx11::string, int)’: 
a.cpp:9:16: warning: ‘A::m2’ will be initialized after [-Wreorder] 
    std::string m2; 
       ^
a.cpp:6:8: warning: ‘int A::port’ [-Wreorder] 
    int port; 
     ^

a.cpp:15:1: warning: when initialized here [-Wreorder] 
A::A(std::string _m1,std::string _m2,int _port) : m1(_m1),m2(_m2),port(_port){ 
^ 
  1. 爲什麼會產生警告?

  2. m2port具有在main中指定的默認值或值嗎?

  3. 爲什麼它不會發生在m1

  4. 這是一個正確的方式來初始化成員變量?

回答

4

在C++成員中,它們按照它們在類中出現的順序進行初始化,而不是在成員初始化程序列表中初始化它們的順序。這意味着這種情況下的訂單是m1, port, m2,而不是像您在初始化程序列表中那樣的m1, m2, port。這很重要,因爲如果您使用一個成員來初始化另一個成員,則需要確保該成員在該類中被首先聲明,否則使用未初始化的值並且這是未定義的行爲。

+0

你是對的,謝謝。 – panitaxx