• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 关于C++类的成员初始化列表的相关问题

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++ 静态成员初始化,c++类的初始化,c++构造函数初始化,c++二维数组初始化,c++静态变量初始化等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(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;

}

};
</div>

上面这个程序的实现机制是: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;

}
</div>

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

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

{

_cnt = 0;

}
</div>

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

Word::Word()

{

_name.Sting::String(0);  //调用String (int) 构造函数

_cnt = 0;

}
</div>

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

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

class X {

  int i;

  int j;

public:

  X (int value) : j (value), i (j)

 {}....

}; 
</div>

以上代码编写者的本意是要把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; }

};
</div>

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ 静态成员的类内初始化详解及实例代码
  • 关于C++中构造函数初始化成员列表的总结
  • 关于C++类的成员初始化列表的相关问题
  • C++利用静态成员或类模板构建链表的方法讲解
  • 深入解析C++编程中的静态成员函数
  • C++中COM组件初始化方法实例分析
  • C++ 类的静态成员深入解析

相关文章

  • 2017-05-28solaris操作系统做c应用程序开发步骤
  • 2017-05-28C++空类及没有成员变量的类的大小实例分析
  • 2017-05-28C语言中字符和字符串处理(ANSI字符和Unicode字符)
  • 2017-05-28浅谈c++ 字符类型总结区别wchar_t,char,WCHAR
  • 2017-05-28C++聚合关系类的构造函数的调用顺序详解
  • 2017-05-28c语言在控制台判定鼠标左键的小例子
  • 2017-05-28浅谈MFC 改变控件大小和位置
  • 2017-05-28VC取得任务栏高度的方法
  • 2017-05-28error LNK2019: 无法解析的外部符号 问题的解决办法
  • 2017-05-28C++实现二叉树非递归遍历方法实例总结

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅析C语言位域和位段
    • C++指向函数的指针实例解析
    • C++输出上三角/下三角/菱形/杨辉三角形(实现代码)
    • C++使用ADO实现存取图片的方法
    • C语言判断回文数的小例子
    • c++支持coroutine的简单示例
    • C语言的递归思想实例分析
    • VC实现ODBC数据库操作实例解析
    • c++传递函数指针和bind的示例
    • C++中strtok()函数的用法介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有