构造函数探索

本文深入探讨了构造函数中的直接初始化与初始化列表、委托构造函数的使用方法及特性,包括初始化列表顺序、隐式类型转换、explicit关键字限制以及静态成员的定义和使用。重点介绍了构造函数在类实例化过程中的作用以及如何有效利用构造函数实现类的灵活初始化。

构造函数的一个重要作用是初始化类的数据成员,初始化有两种方法,一种是在函数的参数列表之后紧跟着初始化列表,另一种是在函数体内部为数据成员赋值。前一种方法是直接初始化,后一种方法是先默认初始化,然后再赋值。两种方法在底层效率和适用范围方面有所不同,const、引用等数据成员因为定义过后不能赋值,必须进行直接初始化,所以只能采用第一种方法,而其他种类的数据成员两种方法都可以使用,但是建议使用第一种方法,以免遗漏不能在定义之后再次赋值的数据成员。初始化在构造函数执行之前进行。


在构造函数进行初始化时,初始化列表中数据成员的顺序是随意的,编译器会按照类中数据成员出现的顺序进行初始化,这一点对于有数据成员使用其它数据成员进行初始化的情况尤为重要,使用一个未知的值进行初始化是十分危险的,所以建议使用构造函数的参数对数据成员进行初始化,尽量避免用一个数据成员去初始化另一个数据成员。


委托构造函数,与函数调用类似。在构造函数的参数列表后面紧跟着另一个构造函数名和实参列表,前面一个构造函数叫做委托构造函数,后面的叫做被委托构造函数,被委托构造函数在委托构造函数之前出现。当编译器执行到委托构造函数参数列表之后的被委托构造函数时,控制权将会转交给被委托构造函数,待被委托构造函数执行完毕控制权再转回委托构造函数去执行函数体中的语句。委托构造函数机制允许嵌套。


如果构造函数只接受一个实参,那么通过此构造函数可以进行类与类之间的隐式类型转换:

//Sales_data是类类型,conbine是它的成员函数,item是Sales_data类对象,Sales_data有一个接受一个string类型实参的构造函数

string null_book="9999-999";//null_book是一个string对象

item.combine(null_book);//编译器调用Sales_data的接受一个string实参的构造函数创建一个临时Sales_data对象,然后将此临时对象作为实参传递给item的combine函数,函数调用完毕之后,临时对象则被销毁。

在构造函数名之前加上explicit关键字可以抑制隐式的类类型转换,此种方法只对一个实参的构造函数有效,多个实参不能用于执行隐式转换。

注:隐式的类类型转换只能进行一步,不能连续进行多步

explicit关键字只能出现在类内部的构造函数定义或者声明处

explicit构造函数只能进行直接初始化,不能进行拷贝初始化,直接初始化与拷贝初始化的区别在于拷贝初始化多了一个中间临时变量,由于explicit关键字抑制了类类型的隐式转换,所以编译器不会根据一个实参去调用类中接受一个实参的构造函数创建临时变量

尽管使用了explicit构造函数,但是还是可以使用显式的类型转换


在类的成员声明前加上关键字static关键字可以将成员定义为静态成员。静态成员只和类相关,不和具体的对象相关,静态的数据成员可以是常量、引用、指针、类类型等,静态的函数成员也不与任何对象关联,所以不包含this指针,静态成员函数不能声明为const,也不能在静态函数体内部使用this指针。可以通过作用域运算符和类名使用静态成员,类内部的非静态成员可以直接使用静态成员。只能为静态成员提供const整数类型的类内初始值,初始值必须是常量表达式,静态成员只能用在适用于常量表达式的地方。类的静态成员尽量在类的外部定义,即便在类内部进行了初始化,也应该在外部再次进行定义。静态成员可以是不完全类型以及为实参提供默认值(非静态成员不能提供实参默认值,因为非静态成员的值直到对象真正创建时才能确定)。静态成员一经创建,直到程序结束才会销毁。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值