代码生成wreorder警告

pan*_*axx 3 c++ gcc-warning c++11

我有以下课程

#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);
}
Run Code Online (Sandbox Code Playgroud)

当用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){
 ^
Run Code Online (Sandbox Code Playgroud)
  1. 为什么会产生警告?

  2. 威尔m2port具有缺省值或值分配main

  3. 为什么不发生m1

  4. 这是初始化成员变量的正确方法吗?

Nat*_*ica 8

在C++中,成员按它们在类中出现的顺序进行初始化,而不是在成员初始化列表中初始化它们的顺序.这意味着,在这种情况下,顺序m1, port, m2,而不是m1, m2, port像你这样在初始化列表中.这很重要,因为如果您使用一个成员来初始化另一个成员,则需要确保在该类中首先声明该成员,否则您将使用未初始化的值,这是未定义的行为.