• 构造函数初始化列表的研究


    在网友“萌丫”大师的指点下,终于到对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注册。

  • 相关阅读:
    C语言开发框架、printf(day02)
    Linux C(day01)
    线程同步、信号量、system v IPC
    UDP、线程、mutex锁(day15)
    Socket编程(day14)
    共享内存、网络(day13)
    pause、jobs、setitimer(2)、system v ipc(day12)
    PIPE、SIGNAL(day11)
    环境变量、system(day10)
    进程(day09)
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319403.html
Copyright © 2020-2023  润新知