C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别

一般我们进行成员变量初始化用两种方法 

第一种是通过在构造函数内赋值 

class Point
{
public:
Point(){ _x = 0; _y = 0;};
Point( int x, int y ){ _x = 0; _y = 0; }
private:
int _x, _y;
}; 

第二种是使用初始化列表 

class Point
{
public:
Point():_x(0),_y(0){};
Point( int x, int y ):_x(x),_y(y){}
private:
int _x, _y;
}; 



这两种用法是有区别的 

一、在有些情况下,必须使用初始化列表。特别是const和引用数据成员被初始化时。 

class Point
{
// 这个类的定义就要求使用初始化成员列表,因为const成员只能被初始化,不能被赋值
public:
Point():_x(0),_y(0){}; 
Point( int x, int y ):_x(x),_y(y){}
//Point(){ _x = 0; _y = 0;}
//Point( int x, int y ){ _x = 0; _y = 0; }
private:
const int _x, _y;
}; 



二、是从效率方面来说的,对于内置类型或复合类型,差异不会太大,但对于非内置数据类型,差异还是很明显的 

如我们再给Point类添加一个新的string类型的成员变量 

class Point
{
const int _x, _y;
string _name;
}; 


构造函数内赋值进行初始化 

Point( int x, int y, string name ){ _x = 0; _y = 0; _name = name; } 


_name = name 这个表达式会调用string类的缺省构造函数一次,再调用Operator=函数进行赋值一次。所以需调用两次函数:一次构造,一次赋值 


用初始化列表进行初始化 

Point( int x, int y, string name ):_x(x),_y(y), _name(name){} 

_name会通过拷贝构造函数仅以一个函数调用的代码完成初始化 

即使是一个很简单的string类型,不必要的函数调用也会造成很高的代价。随着类越来越大,越来越复杂,它们的构造函数也越来越大而复杂,那么对象创建的代价也越来越高,所以一般情况下建议使用初始化列表进行初始化,不但可以满足const和引用成员的初始化要求,还可以避免低效的初始化数据成员。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】深度理解C# 的执行原理

转自:https://zhuanlan.zhihu.com/p/47177008 从编译原理说起虚拟机是什么C# 是什么,IL 又是什么.Net Framework vs MonoUnity3D 中的 C#小结作者:易立 | 腾讯IEG高级工程师为什么 Unity3D 可以运行 C#,C# 和 Mono 是什么关系&am…

C#提供的类库能够轻松实现对文件的操作

//C#写入/读出文本文件 stringfileName "c:I.txt";   StreamReader sr newStreamReader(fileName); stringstrsr.ReadLine (); sr.close();  StreamWriterrwFile.CreateText(Server.MapPath(".")"\myText.txt");   rw.WriteLine("写入…

Java程序员的推荐阅读书籍

作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水…

【转】Win10系统创建WiFi热点的两种方法

现在电脑和wifi已经成为很多人生活中不可缺少的一部分,上网过程只有连接WiFi才可以上网。使用windows10系统开启WiFi热点都是提示没有找到支持的无线网卡。不管你是驱动更新,重装,还是怎么操作都是不能用。为此,大家不妨参考下文方…

影院平台搭建 - (6)一个靠谱的视频播放方案的感想

折腾了我很久很久,让我一个月内天天只睡不到6个小时。总算折腾出一套至少我觉得是比较靠谱的东西了。在这里总结一下:1、如果追求画面质量,就不要用FLV格式,算法的先天缺陷导致无论怎么调试画面质量都不能上去。YouTube用MP4格式作…

【转】Win10系统怎么设置无线做AP热点_win10设置无线为ap热点的步骤

转自:http://www.win7zhijia.cn/win10jc/win10_33126.html 在win10系统中,默认情况下无线网卡大部分都用于STA模式,但是有时候需要将无线网卡的工作模式为SoftAP,这样如果有双网卡的话,就能够将本机网络共享给其他PC或…

虚析构函数解析

C 指出:当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。如果一个类要被另外一个类继承,而且用其指针指向其子类对象时&#…

SQL Server 2005参考:PIVOT

SQL Server 2005参考:PIVOT 可以使用 PIVOT 和 UNPIVOT 关系运算符对表值表达式进行操作以获得另一个表。 (1)PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来转换表值表达式,并在必要时对最终输出中所需的任何其余的列值执行聚合。 (2)UNPIV…

【转】wifi的几种工作模式

转自:https://www.cnblogs.com/Ph-one/p/12455362.html https://www.cnblogs.com/jpzhu/p/11983992.html WIFI配置具体的模式主要有以下这几种:STA模式、AccessPoint模式、Monitor模式、Ad-hoc(IBSS)模式、WDS模式、Mesh模式。 …

C++结构体实例和类实例的初始化

结构体实例(包括共用体)和类实例的初始化方法完全相同,二者都可以应用于继承层次中。不同点是结构体(包括共用体)默认成员为public,而类默认成员是private型的。 一、若类和结构体所有数据成员均为public型…

【转】WIFI-Direct(Wifi直连)、AirPlay、DLAN、Miracast功能介绍

转自:https://www.cnblogs.com/yuanqiangfei/p/11674640.html 不知道大家对无线同屏技术有多少了解,当这种技术普及的时候,我想我们的工作与生活又会方便很多吧!下面是目前三种主流同屏技术的介绍: 目前这种将终端信…

[轉]C# 中的委托和事件

轉自:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.htmlpdf:http://www.tracefact.net/Document/Delegates-and-Events-in-CSharp.pdfC# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件…

可以让你少奋斗十年的工作经验

这个文章我看后,感触很深,写的很实际,也是我们很值得学习的,但是关键是我们要做到,很不容易啊,如果能都做到,那你就是一个牛人,我现在是没有都做到,但是我想努力去做到。…

【转】CT的FOV是什么含义

CT的FOV是什么含义 - : 视场,也可以说扫描范围24mm 在光学中FOV是什么意思 - : 视场角(FOV): 一个光学系统所能成像的角度范围. 角度越大, 则这个光学系统所能成像的范围越宽, 反之则越窄. 在实际产品当中, 又有光学FOV和机械FOV之分, 光学FOV是指SENSO…

MyEclipse 快捷键

Ctrl1 快速修复(最经典的快捷键,就不用多说了)CtrlD: 删除当前行CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt↑ 当前行和上面一行交互位置(同上)Alt← 前一个编辑的页…

中国的程序员为什么这么辛苦?

做IT已经十年了。十年了,苦吃了不少,经验也有些。现在却越来越讨厌做开发了,越来越不想做IT。大学时曾经的梦想早已灰飞烟灭。现在回头想想,真是入错了行。恰同学少年那会儿,正是IT在中国兴起不久,满怀激情…

【转】解决MeasureString 不准确的问题

转自:https://www.cnblogs.com/MRRAOBX/articles/7473803.html 我在将字符串(含中文)Draw到一幅图片上时发现不准这个问题的。 比如一幅图片的宽是400pixel,Graphics对象g的GraphicUnit是Pixel,我要画到图上的字符串是str,我用g.MeasureString(str.Sub…

JS的手写TRIM函数

JS的手写TRIM函数 转载于:https://www.cnblogs.com/vibratea/archive/2009/07/24/1530109.html

专家观点:你必须了解的嵌入式Linux特性

如今,Linux正广泛应用于各种 嵌入式设备 的开发中,如数字电视、视讯转换盒、DVR播放器、xDSL/有线/PON调制解调器、家用路由器和 网络 网关。它尤其适合具有先进网络功能、大量设备驱动程序的数字家庭和家庭网络。除了嵌入式设备,Linux还支持…

【转】小谈PNG转SVG的方法 在线转换网站与illustrator

转自:https://www.aspirantzhang.com/network/png_to_svg.html 本文主要探讨JPG/PNG转SVG矢量格式并支持FILL的方法,介绍在线转换网站和通过illustator转换的经验。 应该说,国内网站很少用到SVG格式,在此之前我只是听过&#xf…