ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

4 避免无用的缺省构造函数

2021-08-03 21:34:13  阅读:176  来源: 互联网

标签:初始化 无用 缺省 new array Class 构造函数


缺省构造函数即没有参数或所有参数都声明了默认值的构造函数,可以在没有任何外部数据下初始化对象。当类没有声明构造函数,编译器会提供一个隐式缺省构造函数。

借由缺省构造函数创建的对象,其成员变量被初始化为固定的或是不确定的值,不能保证类的成员都被正确初始化。当类有一个无意义的缺省构造函数,未能将所有部分正确初始化,类的成员函数则必须另外测试成员变量是否是有效的,付出了更多的代码,因此应尽量避免。

没有缺省构造函数的类必须传入外部数据来构造,让人相信这个类的对象会被正确的实现,但也存在使用上的限制。

对象数组

直接声明对象数组,会调用类的缺省构造函数,如果没有则必须为数组初始化传参。

Class array[10];//error: no matching function for call to "Class::Class()"
Class array[10] = {{val1, val2, ...}, ...};//correct

但对于堆分配的对象数组(new []),并不能通过上述方式传参。

Class * array = new Class[2];//error: no matching function for call to "Class::Class()"
Class * array = new Class(value)[2];//error: 语法错误

可以通过(类)指针数组来替代对象数组,并逐个为指针分配堆内存。对应的,在释放时也需要逐个调用析构函数。

Class * array[10];
for(auto it : array)
{
    it = new Class(value);
}

指针数组的方式使用了额外的内存保存指针,可以使用placement new方法为数组分配raw memory,在内存中构造对象。

int size = 10;
void * memory = operator new[](size * sizeof(Class));//类似malloc返回未处理的堆内存块地址
Class * array = static_cast<Class *>(memory);
for(int i=0; i<size; ++i)
{
    new (&array[i]) Class(1, 2);//在已分配的地址上构造对象
}

释放时以相反的顺序首先逐个调用析构函数,最后释放内存。

for(int i=0; i<size; ++i)
{
    array[i].~Class();
}
memory = static_cast<void *>(array);
operator delete[] (memory);

在模板容器中使用

标准vector没有要求参数类型必须有缺省构造函数,但并不是所有容器都如此。没有缺省构造函数的类在模板中的兼容受到限制。

pair<int, Class> pa;//error: no matching function for call to 'std::pair<int, Class>::pair()'

虚基类

虚基类是否提供缺省构造函数是一个两难的决定。如果虚基类没有缺省构造函数,几乎所有的派生链在实例化时都必须给它的构造函数提供参数,那么无论派生多远都需要了解这些参数的意义才能正确初始化。如果虚基类提供缺省构造函数,就必须为安全性做保证,花费额外的代码去测试是否正确初始化。

标签:初始化,无用,缺省,new,array,Class,构造函数
来源: https://www.cnblogs.com/sandersunkown/p/15096447.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有