c++构造函数谁先执行的问题

看到网上一哥们的帖子  http://blog.csdn.net/maray/article/details/7761709 东西不多就转发了
1
#include <iostream> 2 3 using namespace std; 4 5 class Element 6 { 7 public: 8 Element(int e = 12) : elem(e) 9 { 10 cout << "element 1" << endl; 11 } 12 int elem; 13 }; 14 15 class ArrayHelper 16 { 17 public: 18 ArrayHelper() 19 { 20 cout<< "cons 1" << endl; 21 } 22 ArrayHelper(int size) : val(size) 23 { 24 cout<< "cons 2" << endl; 25 } 26 ArrayHelper(const ArrayHelper &other) 27 { 28 cout<< "cons 3" << endl; 29 val = other.val; 30 } 31 32 ArrayHelper &operator=(const ArrayHelper &other) 33 { 34 cout<< "cons 4" << endl; 35 val = other.val; 36 s = other.s; 37 return *this; 38 } 39 public: 40 int val; 41 Element s; 42 }; 43 int main() 44 { 45 ArrayHelper x; 46 ArrayHelper m(12); 47 ArrayHelper v = m; 48 v = m; 49 cout<< v.val << endl; 50 }
打印结果
element 1
cons 1
element 1
cons 2
element 1
cons 3
cons 4
12
说明:
我们经常会弄混到底是类定义的对象先执行构造函数,还是类里面的其它类对象先执行.弄不清这个问题是因为没弄清参数列表.
我们知道下面的情况必须要用参数列表:
class A
{
public:
A():i(3) {};
const int i;
int j;
}
可以看到i的初始化工作是在参数列表中完成的,在构造函数的函数体(花括号内仅仅是赋值而已).那么j呢,参数列表中没写j的话j的初始化工作在哪里完成? 答案是虽然没写但是j的初始化也是在初始化列表中完成的.
看下面的例子
class B
{
public:
int b;
B& operater = (const B& T){
this->b = 3;
return *this; }
B(const B& T){
this->b = 4;}
}
class A
{
  public:
B m_b;
//type1
A(const B& T) : m_b(T){}
//type2
A(const B& T){ m_b = T;}
}
当A用type1的构造函数的时候m_b.b等于几? 当A用type2的构造函数的时候m_b.b等于几?
type1下结果: 
3
3
type2下结果
3
4

所以,不管有没有参数列表,成员变量都是在参数列表中定义的.然后才会执行花括号内部的东西

 

转载于:https://www.cnblogs.com/silentNight/p/5501378.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值