专栏首页秘籍酷类成员的初始化与赋值

类成员的初始化与赋值

首先,我们来普及一个尽人皆知的简单事实:如果一个变量在定义的时候未被初始化,那么它的值会根据具体的存储位置或被处理成0,或被处理成随机值。

因此,在学习编程的初期,教导者一般都会告诉我们要谨慎对待初始变量,而对于类来说,最保险的做法是在每一个构造函数中,对每一个成员数据进行恰如其分的初始化。

这么简单的事情,还需要注意什么吗?

让我们来看一个最简单的例子:

class node1 { public: node1(int xx, int yy); private: int x; int y; };

此例中,如果x的值未被对象构造函数初始化,其数值是不确定的“随机值”,因此我们也许会在构造函数中这么写:

node1::node1(int xx, int yy) :x(xx) { y = yy; }

其中,x 以构造函数特有的语法(初始化列表)的形式被初始化,而 y 则在构造函数中被赋值。

以上两种做法显然都可以使得在类对象调用构造函数之后,保证 x 和 y 的值都是确定的数,但我们要牢记的是,初始化(initialization)和普通的赋值(assignment)语句是有区别的,他们的区别是:

  1. 初始化发生的时机比赋值要早。初始化发生的时刻实际上是程序刚刚开始运行的时候,而赋值语句则要等到程序执行到该语句才开始。
  2. 初始化的执行效率比赋值要高。事实上,类的成员数据在构造函数中被赋值之前,已经被系统进行过一次 default 的初始化,因此赋值语句相当于抹掉了先前初始化的执行效果,使得系统做了一次无用功。而在构造函数中运用初始化列表则可以避免这样的效率浪费。
  3. 常量成员(const)和引用成员(reference)只能使用初始化列表来赋值。关于这点,是C++语言的语法规则,比如:

class node2 { public: node2(int aa, int rr); private: int const a; int &r; };

上述代码中的a和r,是两个必须初始化的量(语法要求),在他们的在构造函数中必须被如下处理:

node2::node2(int aa, int rr) :a(aa), r(rr) // 使用初始化列表来赋初值 { }

另外要注意一点,类中的初始化次序是固定的:首先初始化基类(如果有的话),然后按照类中声明的次序初始化派生类的每一个成员。这个次序不受构造函数的初始化列表的次序的影响。换句话说,以上代码即便改成这样:

node2::node2(int aa, int rr)

:r(rr), a(aa) // 依然会先初始化a,再初始化r

{ }

初始化的次序依然是a、r,因为类声明中就是先a再r。这在某些需要注意成员初始化次序(比如先得有数组大小,再能定义数组)的场合特别值得留意。

本文分享自微信公众号 - 秘籍酷(mijiku040),作者:林世霖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C语言(一个真实的故事)

    曾经有一个简单又不失牛逼的小技巧,老师教的时候我没有珍惜,等到同事因为用了这个技巧升任总工才后悔莫及,如果上天再给我一次机会,我会对老师说:我要学!如果非要定个...

    用户2617681
  • Linux基础(强大到流泪的find/grep)

    在linux下面工作,有些命令能够大大提高效率。本文就向大家介绍find、grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们。这篇推送较长...

    用户2617681
  • Linux音视频(V4L2运行原理)

    Linux内核用一个被称为V4L2的机制来管理摄像头图像信息,它的核心工作原理就像日本料理店常见的流转餐桌,大厨将美食不断放到空盘子里,客人不断拿来吃。

    用户2617681
  • 调优哪家强——tensorflow命令行参数

    深度学习神经网络往往有过多的Hyperparameter需要调优,优化算法、学习率、卷积核尺寸等很多参数都需要不断调整,使用命令行参数是非常方便的。有两种实现方...

    用户1332428
  • Python数据分析之贴吧的问与答读取数据库获取question列分词词云

    罗罗攀
  • 按部就班的吴恩达机器学习网课用于讨论(1)

    有回归问题(推测出连续值,如房价),分类问题(推测出离散的输出,如鉴别肿瘤的种类)

    嘘、小点声
  • 全新角度剖析--iOS面试

    我们很多iOS面试官在招聘的时候,很多都是直接在网上找一份iOS面试题就开始面试了!(?偷懒?)而我觉得这是一个很错误的做法。网上很多面试题的确不错,但是这样招...

    猿_人类
  • 杨小杰站长之家工具箱1.0

    Youngxj
  • 用 Wolfram 语言发掘数学殿堂中的瑰宝

    WolframChina
  • 强化学习精品书籍

    这本书在强化学习领域的地位就类似于 Options, Futures and Other Derivatives 在量化金融利于的地位。在本书 (2018 年 ...

    用户5753894

扫码关注云+社区

领取腾讯云代金券