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

1 最近在写一个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 = "<

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/oyzz1988/archive/2010/03/10/5366777.aspx

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值