C++编程技巧:非必要不提供默认空构造函数

一、默认空构造函数不是必要的

相较其他构造函数,默认空构造函数的特点是不需要提供任何参数就能构造出一个对象。

但我们实际创建对象并不总是可以这样。比如创建一个「身份证」对象,身份证号总是必须的。因此,在部分类中提供默认空构造函数并无意义。

二、不提供默认空构造函数的限制

如果我们对这种类不提供默认空构造函数,会在使用中带给我们一些限制,这里一一列举说明:

1、创建对象数组的限制

假设有一个代表身份证的类「ID」,按照规则我们不提供默认空构造函数。现在,我们尝试创建「ID」的对象数组:

这两种创建方法都会失败,明显看出它们都使用了「ID」的默认空构造函数,但我们并没有提供。

①、「ID」的非堆数组创建方法

只要在定义数组时提供参数,就能成功创建非堆数组。但是这种方法在堆数组创建上无效。

②、「ID」的堆数组创建方法

要在堆中创建「ID」对象数组,只能通过指针间接进行。最后得到的是一个「ID」对象指针数组,其中每一个指针都指向堆中的一个「ID」对象。

这种方法会带来两个问题。首先,我们在释放这个数组时,必须先一个一个的释放「ID」对象。其次,我们分别存储了指针数组和对象,占用了更多的内存空间。

③、通过原始内存创建「ID」的堆数组

这个方法可以规避占用更多内存的问题。其具体原理是我们先申请一块可以放下所有「ID」对象的内存空间,用「ID」对象数组的方式读取使用这块内存,最后在这块内存中创建「ID」对象即可。

这种方法的缺点是太过复杂,包括它的数组释放步骤也不太常规:

2、使用模板集合类时的限制

在实现模板集合类时,我们几乎不可避免地会使用模板对象数组。此时如果模板对象是没有默认空构造函数的,就要要求我们对这种情况进行谨慎设计。

C++的标准vector等就做到了谨慎设计,但我们使用其他模板集合类时,并不能保证这种情况。事实上大部分模板集合类都缺乏这种兼容性。

3、虚基类的限制

想一想,如果一个虚基类没有默认空构造函数,那我们创建它的任何一个派生类对象时,都要将虚基类需要的参数传递上去。

这要求我们必须始终记得虚基类构造需要参数,这个参数的类型与意义。

三、总结

现在再看,没有默认空构造函数特别的麻烦。但我们给不需要默认空构造函数的类添加上就没有问题了吗?

实际上问题并不少,我们需要警惕创建出无意义的对象,并且每次使用前都要判断对象有无意义。同时我们还要针对无意义对象的情况做出处理。

因此,不提供非必要的默认空构造函数相对看起来更好处理。

Powered by 意昂体育 RSS地图 HTML地图

Copyright Powered by站群系统 © 2013-2024

意昂体育