利用成员列表初始化对象

ZDNet软件频道 时间:2003-07-30 作者:ZDNet China |  我要评论()
本文关键词:embedded
本文通过例子说明当初始化的成员为类时,成员初始化列表比构造函数列表更有效。
本文译自Builder.com,未经许可请勿转载 一个成员初始化表通常在构造函数的body执行之前初始化类的数据成员。例如:

class ratio {
public:
 ratio(int top, intbot) : //mem-init list
  x(top), y(bot)
{
 //ctor body. At this point
 //x & y have been initialized
}
private:
 int x, y;
};

  在下面几种情况下必须遵守成员初始化列表:

  •    初始化一个常数;
  •    初始化引用成员;
  • 调用base class构造函数;
  • 调用embedded objec构造函数;

另外,成员初始化列表是任意的,但是,它在构造函数中的初始化效率更高。下面的例子充分证明了这一点。它使用了初始化数据成员的两种形式。

class person
{
string _name;
public:
 person(string name)
};

class person
{
string _name;
public:
 person(string name) : _name(name) {}
};

从表面上看这两个例子差不多,但深究其实质却大不一样。第一个例子中,自变量被传值,当它在执行时,一个副本在构造函数的栈中被创建,当构造函数终止运行时,这个副本就被杀死。

对比来看第二个例子,它避免创建副本并杀死它的过程,因为使用了成员初始化列表。通常,当初始化的成员为类时,成员初始化列表比构造函数列表更有效。

一个非行内的构造函数的成员初始化列表通常出现在定义中而不是声明中。在下面的例子中,class body包含了一个声明的构造函数,这个构造函数没有成员初始化列表,成员初始化列表出现在构造函数的定义中。

class ratio {
public:
 ratio(int top, intbot); // no initialization list here
};

ratio::ratio(int top, intbot) : x(top), y(bot)
{}



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134