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