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

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

原文地址:https://www.cnblogs.com/zjypp/p/2319403.html