代码生成 wreorder 警告
code generating wreorder warning
我有以下 class
#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){
^
为什么会产生警告?
m2
和 port
是否会在 main
中分配默认值或值?
为什么 m1
不会发生?
这是初始化成员变量的正确方法吗?
在 C++ 中,成员按照它们在 class 中出现的顺序进行初始化,而不是按照您在成员初始化程序列表中初始化它们的顺序。这意味着在这种情况下的顺序是 m1, port, m2
而不是 m1, m2, port
就像你在初始化列表中那样。这很重要,因为如果您使用一个成员来初始化另一个成员,则需要确保该成员首先在 class 中声明,否则您将使用未初始化的值,这是未定义的行为。
我有以下 class
#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){
^
为什么会产生警告?
m2
和port
是否会在main
中分配默认值或值?为什么
m1
不会发生?这是初始化成员变量的正确方法吗?
在 C++ 中,成员按照它们在 class 中出现的顺序进行初始化,而不是按照您在成员初始化程序列表中初始化它们的顺序。这意味着在这种情况下的顺序是 m1, port, m2
而不是 m1, m2, port
就像你在初始化列表中那样。这很重要,因为如果您使用一个成员来初始化另一个成员,则需要确保该成员首先在 class 中声明,否则您将使用未初始化的值,这是未定义的行为。