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和引用成员的初始化要求,还可以避免低效的初始化数据成员。
C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别相关推荐
- 初始化列表和构造函数内赋值的区别
1. 类的静态成员变量不能用参数初始化表初始化 (1) 如果声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,在运行的时候才为对象的数据成员分配空间.但是静态数据成员不属于 ...
- 【C++】类的成员初始化表与构造函数内赋值操作
我们常常在初始化类数据成员的时候,对使用初始化表和在构造函数中十分困惑,这二者有什么区别呢?我们应该如何选择呢? 先举个简单的例子,看下面的两段代码: 代码A: inline Account::Acc ...
- 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?
初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...
- 问题十六:使用初始化列表的构造函数和使用函数体的构造函数有什么区别?
先看一段代码: class sphere: public hitable{ public: sphere() {} sphere(vec3 cen, float r) : center(cen), r ...
- C++构造函数初始化列表与构造函数中的赋值的区别
转载 C++构造函数初始化列表与构造函数中的赋值的区别 2016-12-10 15:16:51 xingpacer 阅读数 10391更多 分类专栏: C++相关 查看全文 http://www.ta ...
- c++ 初始化列表和构造函数初始化区别
先上代码 #include <iostream>class MyContruct { public:MyContruct(){std::cout << "MyCont ...
- C++学习笔记:成员初始化列表【Cherno】
先带着几个问题来看文章: 为什么要有初始化列表.怎么写初始化列表,初始化列表的好处是什么: 1:为什么要有初始化列表: 很简单,为了提高效率和C++风格化,先说C++风格化,如果我们要在一个构造函数中 ...
- C++远航之封装篇——默认构造函数、初始化列表、拷贝构造函数
1.默认构造函数 没有参数: 若有参数,则一定全部都有默认的参数值. 2.初始化列表 (1)概念 (2)特性 建议用初始化列表来初始化数据成员. 初始化列表先于构造函数执行: 初始化列表只能用于构造函 ...
- C++构造函数初始化列表与赋值
C++中类的初始化操作一般有四个部分组成: 1.构造函数初始化列表 2.构造函数体内赋值 3.类外部初始化 4.类声明时直接赋值 对于内部数据类型(char,int,float...),构造函数初始化 ...
最新文章
- 5300亿NLP模型“威震天-图灵”发布,由4480块A100训练,微软英伟达联合出品
- 一本跳进挨踢生活圈的日记(南京站)
- python 中值滤波
- 安装和规划邮件服务器
- 第十二届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组
- rust军用船指令_RUST物品指令清单(英文版)
- Pytorch教程(十三):reshape、squeeze、flatten
- 大数据架构如何挑选机器.
- 顶级Javaer,常用的 14 个类库
- 微型计算机接口技术与汇编语言课后答案
- 安全狗云备份爆笑段子~~~如果上天再给我一次机会
- Windows10安装IIS服务器
- 敌兵布阵 HDU - 1166(树状数组-模板线段树写法)
- 我的世界java1.15.2光影_我的世界Java版带光影
- (VCIP-2018)基于选择性卷积特征的广义均值池化细粒度图像检索
- java对接paypal支付应用实例 (v2)
- 文件夹双击提示找不到应用程序,右键可以打开(已解决)
- 量子计算机应用于哪些领域,量子计算的应用领域
- python二级操作题分值_计算机二级MS Office考试具体内容及分值
- C#软件license管理(简单软件注册机制)