2016-12-22 14 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. Будет ли m2 и port иметь значение или значение по умолчанию, указанное в main?

  3. Почему это не происходит с m1?

  4. Это правильный способ инициализации переменных-членов?

ответ

4

В элементе C++ инициализируются в том порядке, в котором они отображаются в классе, а не в порядке, в котором они инициализируются в списке инициализаторов членов. Это означает, что порядок в этом случае равен m1, port, m2, а не m1, m2, port, как у вас в списке инициализаторов. Это важно, потому что если вы используете один элемент для инициализации другого, вам нужно убедиться, что член объявлен первым в классе, иначе вы используете неинициализированное значение и это неопределенное поведение.

+0

Вы правы, спасибо. – panitaxx

 Смежные вопросы

  • Нет связанных вопросов^_^