开发Qt碰到的第一个问题(when initialized here)

最近在写一个qt程序,碰到了一个warning,虽然明白怎么避免 2 但是开始不明白为什么要报这个warning 3 4 //程序抽象一下,如下 5 //test.cpp 6 #include 7 using namespace std; 8 9 class A 10 { 11 int m_a; 12 int m_b; 13 public: 14 A():m_b(0), m_a(0) {} 15 }; 16 17 18 int main() 19 { 20 return 0; 21 } 22 23 //编译 24 g++ -g -Wall -o test test.cpp 25 26 //你就会发现一个Warning 27 E:/source/test>make 28 g++ -g -Wall -o test test.cpp 29 test.cpp: In constructor `A::A()': 30 test.cpp:7: warning: `A::m_b' will be initialized after 31 test.cpp:6: warning: `int A::m_a' 32 test.cpp:9: warning: when initialized here 33 34 也就是说初始化顺序跟变量申明顺序有问题, 35 但事实上为什么会报这个warning? 36 或者说,编译器认为,m_a申明在m_b之前, 37 但是m_b比m_a先初始化,到底会带来怎样意想不到的结果 38 39 这个就要追溯到,c++的initialization list机制 40 A():m_b(0), m_a(0){} 41 这个初始化,到底是怎么实现的 42 其实c++会在这个构造函数里面加入他们的初始化代码 43 于是这个构造函数等价与 44 A() { 45 m_a = 0; 46 m_b = 0; 47 上面是用户不可见,c++自己生成部分 48 ..... // 这些是用户添加的代码 49 } 50 你现在已经惊奇的发现,虽然 51 A():m_b(0), m_a(0); 52 m_b的初始化在m_a前面,但是m_a确先初始化 53 理由只有一个,这个编译器自动添加代码的顺序 54 是按照类成员的申明顺序添加的!!!!!! 55 56 57 //我们写个简单的程序测试一下 58 59 #include 60 using namespace std; 61 62 class A 63 { 64 int m_a; 65 int m_b; 66 public: 67 A():m_b(-1), m_a(m_b) {} 68 void print() { cout<<"m_a = "<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值