使用构造函数初始化列表

来源:互联网 发布:php curl multi exec 编辑:程序博客网 时间:2024/05/22 17:14

   构造函数具有名字、形参表和函数体,与其他函数不同的是,构造函数也可以包含一个构造函数初始化列表


student::student(string a,int b):

name(a),  num(b)  {}


其中以冒号开始,以左花括号结束的部分为构造函数初始化列表

这个构造函数将name成员初始化为形参a的值,将num成员初始化为形参b的值

然而省略初始化列表并在构造函数的函数体内对数据成员赋值是合法的

student::student(string a,int b)

{name=a;

num=b;

}


这两段代码的具有同样的效果,都是将形参赋给类的数据成员

  但这两段代码实质上是不同的

第二段代码实际上进行了两步操作,先进行隐形初始化(若数据成员都为内置数据类型,则不进行此步)然后再在函数体中对其赋值覆盖初始化的值

原因是不管成员是否在构造函数初始化列表中显式初始化,类型的数据成员总是在初始化阶段初始化

其成员初始化方式取决于数据成员的类型:数据成员为类类型的运行默认构造函数进行初始化,而数据成员为内置类型的初始值依赖于对象的作用域:在局部作用域中这些成员不被初始化,而在全局变量中它们被初始化为0

也就是说若你在主函数或自定义函数中定义了一个对象object

  int main{}

{student object("xiaohong",1);}

若其构造函数为第二个版本,则先运行string类的默认构造函数将数据成员name初始化为空串,不对int型的num成员进行初始化,然后再将“xiaohong”赋给name,将1赋给num

若在全局作用域中定义对象object

student object("xiaohong",1);

int main()

{}则int型的num也会被初始化为0,再被赋值


总的来说,若数据成员都为内置类型,则这两个版本的构造函数无区别,若有类类型则第二个版本则无端端地多了一步操作:先初始化再赋值。但也无伤大雅

但是,有一些情况却是一定要使用构造函数初始化列表的

1.数据成员类型是没有提供默认构造函数的类类型

2.数据成员是const或引用类型。毕竟const类型和引用类型都是只能初始化而不能赋值的


所以,请最好使用构造函数初始化列表形式的构造函数


原创粉丝点击