C/C++

推荐列表 站点导航

当前位置:首页 > 脚本编程 > C/C++ >

C++_关于C++类的成员初始化列表的相关问题,在以下四中情况下,要想让程

来源:网络整理  作者:网友投稿  发布时间:2020-12-28 08:34
关于C++类的成员初始化列表的相关问题,在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member i...

在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member initialization list):

1,初始化一个引用成员(reference member);

2,初始化一个常量对象(const member);

3,调用一个基类的构造函数,且该基类的构造函数有一组参数;

4,调用一个成员类(member class)的构造函数,且该构造函数有一组参数

这四种情况程序可以正常编译,但是效率有所欠缺(下面会具体说到)。

class Word{ String _name; int _cnt; public: Word() { _name = 0; _cnt = 0; } };

上面这个程序的实现机制是:Word类的构造函数会先生成一个String类的临时对象(注意,_name是String类的对象),然后对该临时对象初始化。

然后通过赋值运算符将临时对象赋给_name,最后析构该临时对象。

以下是构造函数的内部扩张结果,c++伪代码:

Word::Word() { _name.String::String(); //调用String类的默认构造函数(default constructor) String temp = String(0); //产生类的临时对象 并初始化 _name.String::operator = (temp); //通过赋值运算符将临时对象的值(深)拷贝给 _name temp.String::~String(); //调用String的析构函数 _cnt = 0; }

以上的代码效率并不高,因为中间需要调用默认构造函数和析构函数生成和销毁一个临时对象,以下是一个更有效率的实现方法:

Word::Word : _name (0) //_name直接调用String类的构造函数对其赋值 { _cnt = 0; }

它会被构造函数扩张成以下的形式(c++伪代码)

Word::Word() { _name.Sting::String(0); //调用String (int) 构造函数 _cnt = 0; }

成员初始化列表并不是一组函数调用,编译器一一操作初始化列表,以适当的顺序在构造函数中插入初始化的操作,并且是在程序员显式的写入代码之前进行。

列表的中的项目次序是由类中的成员声明次序决定的,不是由初始化列表中的排列顺序决定。“初始化次序”和“初始化列表中的项目排列顺序”的错乱会带来意想不到的错误:

class X {   int i;   int j; public:   X (int value) : j (value), i (j)  {}.... };

以上代码编写者的本意是要把j的初值设置为 value, 再把 i 的初值设置为 j 。然而,由于声明次序 i 在 j 之前,初始化列表中 i(j) 实际上比 j(value)更早执行,

这就带来了意想不到的错误。正确的写法应该是:

 class X {   int i;   int j; public:   X (int value) : j (value) // j (value) 此处调用构造函数赋初值 { i = j; } };

虽然这种写法仍然是 i 声明在 j 之前,但是并不会发生错误,因为初始化列表中的项目被插入到构造函数中不会再保持原来的声明次序,也就是说初始化列表被插入到构造函数中初始化列表中的项目顺序优先级高于代码编写者显式声明的顺序。

以上这篇关于C++类的成员初始化列表的相关问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持phpstudy。

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/jiaob/cjj/10100.shtml

最新文章
只需要在调用Ctrl+B编译后 只需要在调用Ctrl+B编译后

时间:2021-01-13

OpenGL超级宝典visual studio OpenGL超级宝典visual studio

时间:2021-01-04

Directx11 教程(2) 基本的wi Directx11 教程(2) 基本的wi

时间:2021-01-04

LeetCode11ContainerWithMostWate LeetCode11ContainerWithMostWate

时间:2021-01-04

C语言简单IT之家速成 C语言简单IT之家速成

时间:2020-12-27

三分钟了解Activity工作流 三分钟了解Activity工作流

时间:2020-12-27

编译器是如何实现32位整型 编译器是如何实现32位整型

时间:2020-12-27

C++中lower_bound函数和upper C++中lower_bound函数和upper

时间:2020-12-27

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

C++_关于C++类的成员初始化列表的相关问题,在以下四中情况下,要想让程

2020-12-28 编辑:网友投稿

在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member initialization list):

1,初始化一个引用成员(reference member);

2,初始化一个常量对象(const member);

3,调用一个基类的构造函数,且该基类的构造函数有一组参数;

4,调用一个成员类(member class)的构造函数,且该构造函数有一组参数

这四种情况程序可以正常编译,但是效率有所欠缺(下面会具体说到)。

class Word{ String _name; int _cnt; public: Word() { _name = 0; _cnt = 0; } };

上面这个程序的实现机制是:Word类的构造函数会先生成一个String类的临时对象(注意,_name是String类的对象),然后对该临时对象初始化。

然后通过赋值运算符将临时对象赋给_name,最后析构该临时对象。

以下是构造函数的内部扩张结果,c++伪代码:

Word::Word() { _name.String::String(); //调用String类的默认构造函数(default constructor) String temp = String(0); //产生类的临时对象 并初始化 _name.String::operator = (temp); //通过赋值运算符将临时对象的值(深)拷贝给 _name temp.String::~String(); //调用String的析构函数 _cnt = 0; }

以上的代码效率并不高,因为中间需要调用默认构造函数和析构函数生成和销毁一个临时对象,以下是一个更有效率的实现方法:

Word::Word : _name (0) //_name直接调用String类的构造函数对其赋值 { _cnt = 0; }

它会被构造函数扩张成以下的形式(c++伪代码)

Word::Word() { _name.Sting::String(0); //调用String (int) 构造函数 _cnt = 0; }

成员初始化列表并不是一组函数调用,编译器一一操作初始化列表,以适当的顺序在构造函数中插入初始化的操作,并且是在程序员显式的写入代码之前进行。

列表的中的项目次序是由类中的成员声明次序决定的,不是由初始化列表中的排列顺序决定。“初始化次序”和“初始化列表中的项目排列顺序”的错乱会带来意想不到的错误:

class X {   int i;   int j; public:   X (int value) : j (value), i (j)  {}.... };

以上代码编写者的本意是要把j的初值设置为 value, 再把 i 的初值设置为 j 。然而,由于声明次序 i 在 j 之前,初始化列表中 i(j) 实际上比 j(value)更早执行,

这就带来了意想不到的错误。正确的写法应该是:

 class X {   int i;   int j; public:   X (int value) : j (value) // j (value) 此处调用构造函数赋初值 { i = j; } };

虽然这种写法仍然是 i 声明在 j 之前,但是并不会发生错误,因为初始化列表中的项目被插入到构造函数中不会再保持原来的声明次序,也就是说初始化列表被插入到构造函数中初始化列表中的项目顺序优先级高于代码编写者显式声明的顺序。

以上这篇关于C++类的成员初始化列表的相关问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持phpstudy。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/jiaob/cjj/10100.shtml

相关文章

风云图片

推荐阅读

返回C/C++频道首页