关于C++类的成员初始化列表的相关问题

 更新时间:2016年05月12日 17:05:39   投稿:jingxian  
下面小编就为大家带来一篇关于C++类的成员初始化列表的相关问题。小编觉得挺

在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(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++类的成员初始化列表的相关问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言通讯录管理系统完整代码

    C语言通讯录管理系统完整代码

    这篇文章主要为大家详细介绍了C语言通讯录管理系统完整代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++从txt文件中读取二维的数组方法

    C++从txt文件中读取二维的数组方法

    今天小编就为大家分享一篇C++从txt文件中读取二维的数组方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C语言实现的猴子偷桃之类算法

    C语言实现的猴子偷桃之类算法

    本文给大家分享的是前些日子去面试的时候的试题,哎,真是没想到会出这么个题,好多年没碰过C了。。。。分享给大家,小伙伴们过来参观下吧。
    2015-03-03
  • C++之boost::array的用法

    C++之boost::array的用法

    这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C++生成key-value键值的三种方式总结

    C++生成key-value键值的三种方式总结

    这篇文章主要为大家详细介绍了C++中生成key-value键值的三种方式,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-09-09
  • VC++的combobox控件用法汇总

    VC++的combobox控件用法汇总

    这篇文章主要介绍了VC++的combobox控件用法,对VC++初学者来说尤为重要,需要的朋友可以参考下
    2014-08-08
  • C语言实现多项式的相加

    C语言实现多项式的相加

    这篇文章主要为大家介绍了C语言实现多项式的相加,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 使用boost读取XML文件详细介绍

    使用boost读取XML文件详细介绍

    这篇文章主要介绍了使用boost读取XML文件详细介绍的相关资料,需要的朋友可以参考下
    2016-11-11
  • C++中类的三种访问权限解析:private、public与protect

    C++中类的三种访问权限解析:private、public与protect

    这篇文章主要介绍了C++中类的三种访问权限解析:private、public与protect,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言学生学籍管理系统课程设计

    C语言学生学籍管理系统课程设计

    这篇文章主要介绍了C语言学生学籍管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论