[深度探索C++对象模型]关于成员初始化列表(member initiallization list)
2024-10-20 11:52:35
四种特殊情况:
1、当初始化一个reference member时。
2、当初始化一个const member时。
3、当初始化一个base class的constructor,而它拥有一组参数时。
4、当初始化一个member class的constructor,而它拥有一组参数时。
除了上面四种情况,其他情况下的选择其实都差不多。而这四种情况如果不使用成员初始化列表,程序能够被正确编译并且执行,但是效率不高。
一个简单的例子
class Word{
String _name;
int _cnt;
public:
Word(){
_name=0;
_cnt=0;
}
};
在这里,Word 的constructor会先产生一个临时性的string object,然后将它初始化,随后赋值给_name,其代码可能会扩张成这样:
Word::Word()
{
//调用String的默认构造函数
_name.String::String();
//产生一个临时对象
String temp=String(0);
//“memberwise”地拷贝_name
_name.String::operator=(temp);
//摧毁临时对象
temp.String::~String();
_cnt=0;
}
注意事项
编译器在实现initialization list时,以适当顺序在constructor之内安插初始化操作,并且在任何explict user code之前。但是有一些细微的地方要注意:list之中的项目顺序是由class中成员变量的声明顺序决定的,不是由initialization list中的排列顺序决定的,例如:
class X
{
int i;
int j;
public:
X(int val):j(val),i(j)
{...}
}
//错误!,i会在j之前先初始化,所以会出错!
最新文章
- 样式PC和手机页面
- CListCtlr 控件的常见用法
- 网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
- C#调用cmd程序,读取结果
- 【HDU1233】还是畅通工程(MST基础题)
- NSNotification消息
- Hibernate框架--配置,映射,主键
- 【20190220】HTTP-知识点整理:TCP/IP与HTTP
- Asp.Net SignalR Hub集线器
- Cron表达式范例
- BeautifulSoup的基本操作
- bzoj 4715
- 【Android】LMK 工作机制
- (二)使用CXF开发WebService服务器端接口
- ActiveMQ producer不断发送消息,会导致broker内存耗尽吗?
- Ubuntu下设置开机后自动运行命令
- MySQL查询字符串长度最长的记录
- vijos1904 学姐的幸运数字
- Keras &; Theano 输出中间层结果
- jQuery或者js保存文件到本地