导航

类的const成员要么有初始化器,要么有显式定义的默认构造函数

类的const成员要么有初始化器,要么有显式定义的默认构造函数这里,不好理解。

一,成员类型有合成的默认构造函数不行,但显式定义为空的默认构造函数可以。
二,如果不是const,成员类型有合成的默认构造函数就行。

看看书上的解释。不对常量进行写操作,脑子被驴踢了都能理解,放拷贝赋值运算符这里,有什么需要拉出来讲的?但是,需要显式定义的默认构造函数来初始化const成员,这不奇怪?我翻遍了类那一章,讲常量成员的,讲默认构造函数的,讲默认构造函数和常量成员的,有提过吗?拷贝控制这里才提,这一章甚至都不讲合成的默认构造函数。

给出自己的理解吧。常量的初始化这里,如果是内置类型,必须显式初始化,如果是类类型,默认初始化就可以。原因是内置类型的默认初始化其值未定义,类类型的默认初始化调用类的默认构造函数。

而默认构造函数这里,至少是默认构造函数的合成版本,其初始化列表是不存在,函数体是为空的。这里,我尝试对成员设置类内初始值,比初始化列表次点,但能达到值初始化的目的,但没用。编译器不管有无类内初始值,它的强制要求就是成员类型必须要有显式定义的默认构造函数,函数体和初始化列表爱空不空。

其实看到十三章,说好的默认构造函数,觉得可以随便编都行,但是是有要达到的目的的,即每个成员都被初始化。编译器是默认显式定义的默认构造函数能做到这一点,这一点还意味着,const的内置类型成员一定被初始化了。

所以我可以写出一个不负责任的显式默认构造函数,但并不对内置类型成员初始化。之后,另一个类有该类型的常量成员。我定义另一个类的对象,其常量成员被默认初始化,但常量成员的内置类型成员实则没有被初始化。在这里,编译器已经管不了了,它也接受了。

我觉得,当我放了这么多屁来解释为什么常量成员的类型没有显式定义默认构造函数会使得类类型的默认构造函数的合成版本是删除的时,我想要表达的并不是书上的这一句话是否奇怪,而是写书的人脑子有病。

 

posted on 2022-08-12 20:56  toughcactus  阅读(25)  评论(0编辑  收藏  举报