前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >类成员的初始化与赋值

类成员的初始化与赋值

作者头像
用户2617681
发布2019-08-08 14:49:34
1K0
发布2019-08-08 14:49:34
举报
文章被收录于专栏:秘籍酷秘籍酷

首先,我们来普及一个尽人皆知的简单事实:如果一个变量在定义的时候未被初始化,那么它的值会根据具体的存储位置或被处理成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。这在某些需要注意成员初始化次序(比如先得有数组大小,再能定义数组)的场合特别值得留意。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档