簡體   English   中英

代碼生成wreorder警告

[英]code generating wreorder 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 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. 這是初始化成員變量的正確方法嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM