《More Effective C++》 4: 非必要不提供默认构造函数

在某个没有默认构造函数的类 class Object中,会在下面三种情况出现问题:

1、产生数组,由于在一般情况下,没有办法为数组提供构造函数的参数,因此,会出现各种问题。

#include <iostream>

using namespace std;

class Object
{
public:
	Object(int ID)
	{
		//... ...
	}
	//... ...
};

int main()
{
	Object objs[100]; //报错: 没有合适的默认构造函数可用
	Object* objs = new Object[100]; //报错: 没有合适的默认构造函数可用
	return 0;
}

《More Effective C++》提供了三种解决方案。

(1) 对于 non-heap 数组可以在定义数组时(heap数组不可用),改进:

Object objs[2] = {
		Object(0),
		Object(1)
	};
(2) 比(1)更一般的做法是使用指针数组代替对象数组:
Object* objs[10];
for (int i = 0; i < 10; i++)
{
	objs[i] = new Object(i);
}

这个方法有两个缺点:其一是容易出现资源泄漏问题,其二就是,消耗内存空间较大。

(3) 先为数组分配raw memory,然后使用“placement new”在这块内存上构造需要的对象。

	//分配足够的raw memory
	void* rawMemory = operator new[](10 * sizeof(Object));

	//让Object指针指向这段内存,这样就可以存储Object对象了
	Object* objs = static_cast<Object*> (rawMemory);

	//利用 placement new构造这块内存的Object对象
	for (int i = 0; i < 10; i++)
	{
		// 《More Effective C++》条款8有提到new的这种使用方式。
		new (&objs[i]) Object(i); 
	}
而对于上面那段空间的释放,也需要一定的技术的:
        //将Object对象按照与构造顺序相反的顺序析构。
	for (int i = 9; i >= 0; i--)
	{
		objs[i].~Object();
	}
	//释放 rawmemory
	operator delete[](rawMemory);


2、如果一个class没有默认构造函数,那么他将不适用于许多基于模板的容器类。

3.抽象基类如果缺乏默认 构造函数的话,其构造函数的参数将会来自遥远的子类,对于子类设计者来说,这是很恐怖的。


虽然没有默认构造函数会有以上的诸多不方便,但是,为了类的清晰度和效率,

《More Effective C++》建议,尽量不提供默认构造函数。

全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
11-15 19:28
已编辑
蚌埠坦克学院 硬件开发
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440428次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41455次浏览 524人参与
# 阿里云管培生offer #
119780次浏览 2219人参与
# 地方国企笔面经互助 #
7923次浏览 18人参与
# 虾皮求职进展汇总 #
114057次浏览 883人参与
# 实习,投递多份简历没人回复怎么办 #
2453918次浏览 34847人参与
# 北方华创开奖 #
107295次浏览 599人参与
# 实习必须要去大厂吗? #
55665次浏览 960人参与
# 同bg的你秋招战况如何? #
75478次浏览 551人参与
# 提前批简历挂麻了怎么办 #
149813次浏览 1977人参与
# 投递实习岗位前的准备 #
1195668次浏览 18546人参与
# 你投递的公司有几家约面了? #
33170次浏览 188人参与
# 双非本科求职如何逆袭 #
661868次浏览 7394人参与
# 机械人春招想让哪家公司来捞你? #
157600次浏览 2267人参与
# 如果公司给你放一天假,你会怎么度过? #
4723次浏览 54人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11332次浏览 270人参与
# 发工资后,你做的第一件事是什么 #
12405次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35599次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20087次浏览 240人参与
# 实习想申请秋招offer,能不能argue薪资 #
39225次浏览 314人参与
# 我的上岸简历长这样 #
451915次浏览 8088人参与
# 非技术岗是怎么找实习的 #
155842次浏览 2120人参与
牛客网
牛客企业服务