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

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

 

posted @ 2016-05-17 13:53  哈哈不是嘎嘎  阅读(517)  评论(0编辑  收藏  举报