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

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

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和引用成员的初始化要求,还可以避免低效的初始化数据成员。

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

  1. 初始化列表和构造函数内赋值的区别

    1.  类的静态成员变量不能用参数初始化表初始化 (1) 如果声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,在运行的时候才为对象的数据成员分配空间.但是静态数据成员不属于 ...

  2. 【C++】类的成员初始化表与构造函数内赋值操作

    我们常常在初始化类数据成员的时候,对使用初始化表和在构造函数中十分困惑,这二者有什么区别呢?我们应该如何选择呢? 先举个简单的例子,看下面的两段代码: 代码A: inline Account::Acc ...

  3. 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?

    初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...

  4. 问题十六:使用初始化列表的构造函数和使用函数体的构造函数有什么区别?

    先看一段代码: class sphere: public hitable{ public: sphere() {} sphere(vec3 cen, float r) : center(cen), r ...

  5. C++构造函数初始化列表与构造函数中的赋值的区别

    转载 C++构造函数初始化列表与构造函数中的赋值的区别 2016-12-10 15:16:51 xingpacer 阅读数 10391更多 分类专栏: C++相关 查看全文 http://www.ta ...

  6. c++ 初始化列表和构造函数初始化区别

    先上代码 #include <iostream>class MyContruct { public:MyContruct(){std::cout << "MyCont ...

  7. C++学习笔记:成员初始化列表【Cherno】

    先带着几个问题来看文章: 为什么要有初始化列表.怎么写初始化列表,初始化列表的好处是什么: 1:为什么要有初始化列表: 很简单,为了提高效率和C++风格化,先说C++风格化,如果我们要在一个构造函数中 ...

  8. C++远航之封装篇——默认构造函数、初始化列表、拷贝构造函数

    1.默认构造函数 没有参数: 若有参数,则一定全部都有默认的参数值. 2.初始化列表 (1)概念 (2)特性 建议用初始化列表来初始化数据成员. 初始化列表先于构造函数执行: 初始化列表只能用于构造函 ...

  9. C++构造函数初始化列表与赋值

    C++中类的初始化操作一般有四个部分组成: 1.构造函数初始化列表 2.构造函数体内赋值 3.类外部初始化 4.类声明时直接赋值 对于内部数据类型(char,int,float...),构造函数初始化 ...

最新文章

  1. 5300亿NLP模型“威震天-图灵”发布,由4480块A100训练,微软英伟达联合出品
  2. 一本跳进挨踢生活圈的日记(南京站)
  3. python 中值滤波
  4. 安装和规划邮件服务器
  5. 第十二届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组
  6. rust军用船指令_RUST物品指令清单(英文版)
  7. Pytorch教程(十三):reshape、squeeze、flatten
  8. 大数据架构如何挑选机器.
  9. 顶级Javaer,常用的 14 个类库
  10. 微型计算机接口技术与汇编语言课后答案
  11. 安全狗云备份爆笑段子~~~如果上天再给我一次机会
  12. Windows10安装IIS服务器
  13. 敌兵布阵 HDU - 1166(树状数组-模板线段树写法)
  14. 我的世界java1.15.2光影_我的世界Java版带光影
  15. (VCIP-2018)基于选择性卷积特征的广义均值池化细粒度图像检索
  16. java对接paypal支付应用实例 (v2)
  17. 文件夹双击提示找不到应用程序,右键可以打开(已解决)
  18. 量子计算机应用于哪些领域,量子计算的应用领域
  19. python二级操作题分值_计算机二级MS Office考试具体内容及分值
  20. C#软件license管理(简单软件注册机制)

热门文章

  1. 关于操作系统的学习总结
  2. 数据库实验四 用户权限管理
  3. c语言判断字符配对,【C语言】判断花括号{}是否匹配
  4. swagger 修改dto注解_Swagger介绍及使用
  5. 10行代码实现小程序支付功能!丨实战
  6. Redis实现之对象(三)
  7. idea启动项目没错,可是debug却一直启动不起来
  8. 20172329 2017-2018-2 《程序设计与数据结构》实验一报告
  9. Windows单机配置Zookeeper环境
  10. T7-Dropout 解决 overfitting 过拟合