2016-12-22 2 views
1

GCC ARM 5.40 컴파일 할 때 나는 다음 클래스코드 생성 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); 
} 

을 가지고 -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