zoukankan      html  css  js  c++  java
  • 构造函数初始化列表的研究

    在网友“萌丫”大师的指点下,终于到对c++的构造函数列表有了一点认识,写下来一是要温故这个概念,二是感谢萌丫master的指点,并让她斧正。(  萌丫,一研究生,数学专业,计算机专业具精通,是我认识的技术很高很深的网友,目前已经在Microsoft了)

    c++中的构造函数初始化在 《C++ Primer》中涉及到过,具体的代码形式就是

    类::构造函数():对象a初始化,对象b初始化,。。。

    {

     //其他成员的赋值

    }

    书中也讲到初始化列表中的对象或者变量也可以再函数体内执行,但是其实这里是有严格的限制的,有的成员必须放在初始化列表中执行,有的可以放在函数体内执行。

    先说说构造函数的一般知识:构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数,构造函数保证每个类成员都有一个合适的初始值;构造函数可以没有参数,也可以有多个参数,构造函数也可以被重载,根据实参来判断执行哪个构造函数。

    构造函数的初始化列表:

    类::构造函数():对象a初始化,对象b初始化,。。。

    {

     //其他成员的赋值

    }

    这是构造函数的一般形式,构造函数列表有点难理解的地方在于省略初始化列表,在函数体内对成员进行赋值也是正确的,

    比如一个类声明了3个成员变量

    string name;int age; 

    ClassA::ClassA(string x)

    {

      name =x;age =2;

    }

    这段代码就没有使用初始化列表,而且编译也是正常。但是其实真正应该理解的是,在执行构造函数的之前,必须初始化各个成员,string 类型的name 和int 类型age。其实构造函数已经隐式对string类型和int类型进行了初始化。在函数体内只是又进行了赋值。

    所以从概念上讲,构造函数包括两部分:1,初始化阶段,2,普通计算阶段也就是构造函数体里面的代码段。也就是初始化必须保证在计算之前完成。

    上面的代码,如果使用初始化列表来对name和age进行实例,都是一样的正确结果。

    真正的区别在与数据成员的类型:

    有时候必须使用初始化列表,在隐式进行初始化的时候,有的类可能没有默认的构造函数,那么系统在执行的时候就会报错,这个时候必须显式的进行初始化列表,还有就是const类型或者引用类型的成员,不论什么类型,都必须在初始化中执行。

    class student

    {

    //一个类数据,存储name,age等信息

    }

    class Test

    {

    public:Test(int li);

    private:int a;const int b;int &c;student m_student;

    }

    Test::Test(int li):m_student(参数)

    {

    a = li;//正常

    b = li;//错误

    c=li;//错误

    }

    可以初始化const对象和引用类型对象,但不能进行赋值,在执行构造函数之前必须对他们进行初始化,而他们的唯一机会就在初始化列表中,student类因此也要放到初始化列表中,而不是函数体内

    thanksc++ primer,and 萌Y

    本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319403.html
Copyright © 2011-2022 走看看