看到网上一哥们的帖子 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
所以,不管有没有参数列表,成员变量都是在参数列表中定义的.然后才会执行花括号内部的东西