• 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

    所以,不管有没有参数列表,成员变量都是在参数列表中定义的.然后才会执行花括号内部的东西
  • 相关阅读:
    常用操作之增、删、改、查
    文本编辑器相关操作
    关于Secondary NameNode
    hive基础概念总结(1)
    Shell 十三问[转]
    《SQL Server 2012 Tutorials Analysis Services Multidimensional Modeling》读后感
    HDFS随笔(1)
    Hue for Apache Hadoop
    大数据面试题总结
    关于数据倾斜
  • 原文地址:https://www.cnblogs.com/silentNight/p/5501378.html
Copyright © 2020-2023  润新知