gpt4 book ai didi

c++ - 代码生成 wreorder 警告

转载 作者:搜寻专家 更新时间:2023-10-30 23:53:22 25 4
gpt4 key购买 nike

我有以下类(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){
^
  1. 为什么会产生警告?

  2. m2port 是否有默认值或在 main 中赋值?

  3. 为什么 m1 不会发生这种情况?

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

最佳答案

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

关于c++ - 代码生成 wreorder 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41288702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com