C++ 生成订单警告的代码

C++ 生成订单警告的代码,c++,c++11,gcc-warning,C++,C++11,Gcc Warning,我有以下课程 #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

我有以下课程

#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);
}
  • 为什么会产生警告

  • m2
    port
    是否具有默认值或在
    main
    中分配的值

  • 为什么m1不发生这种情况

  • 这是初始化成员变量的正确方法吗


  • 在C++成员中,P>按类中出现的顺序初始化,而不是在成员初始化列表中初始化它们的顺序。这意味着本例中的顺序是
    m1,port,m2
    ,而不是像初始值设定项列表中那样的
    m1,m2,port
    。这一点很重要,因为如果使用一个成员初始化另一个成员,则需要确保该成员在类中首先声明,否则将使用未初始化的值,这是未定义的行为

    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){
     ^