子中,构造函数用这种句法来初始化内置类型的成员

发布时间:2024年01月23日

=-

子中,构造函数用这种句法来初始化内置类型的成员:
Queue: :Queue (int qs) : qsize (qs) { ... ) // initialize qsize to qs
上:述代码在成员初始化列表中使用的是数据成员的名称(qsize)。另外,前面介绍的范例中的构造函
数还使用成员初始化列表初始化派生对象的基类部分:
hasDMA : :hasDMA (const hasDMA & hs) : baseDMA Chs) ( ... F
对丁继承的对象,构造函数在成员初始化列表中使用类名来调用特定的基类构造函数。对于成员对象,
构造函数则使用成员名。例如,请看程序清单14.1的最后一个构造函数:
Student (const char * str, const double * pd, int n)
: name (str), scores (pd, n) {]
因为该构造函数初始化的是成员对象,而不是继承的对象,所以在初始化列表中使用的是成员名,而
不是类名。初始化列表中的每一项都调用与之匹配的构造函数,即name(str)调用String(const char*)
构造函数,scores(pd,n)调用ArrayDb(const double*,int)构造函数。
如果不使用初始化列表句法,情况将如何呢?C++要求在构建对象的其他部分之前,先构建继承对象
的所有成员对象。因此,如果省略初始化列表,C++将使用成员对象类的默认构造函数。

初始化顺序
当初始化列表包含多个项目时,这些项目被初始化的顺序为它们被声明的顺序,而不是它们在初始化
列表中的顺序。例如,假设Student构造函数如下:
Student (const char * str, const double * pd, int n)
: scores (pd, n), name (str) {]
则 name 成员仍将首先被初始化,因为在类定义中它首先被声明。对于这个例子来说,初始化顺序并
不重要,但如果代码使用一个成员的值作为另一个咸员的初始化表达式的一部分时,初始化顺序就非常重
要了。

2. 使用被包含对象的接口
被包含对象的接口不是公有的,但可以在类方法中使用它。例如,下面的代码说明了如何定义一个返
回学生平均分数的函数:
double Student : :Average () const

if (scores.size() > 0)
return scores.sum() /scores.size();
else
return 0;

上述代码定义了可由Student对象调用的方法,该方法内部使用了valarray 的方法size()和sum()。这
是因为scores是一个valarray对象,所以它可以调用valarray类的成员函数。简而言之,Student对象调用
Student的方法,而后者使用被包含的valarray 对象来调用 valarray类的方法。
同样,可以定义一个使用string版本的 << 操作符的友元函数:
// use string version of operator << ()
ostream & operator << (ostream & os, const Student & stu)

os << "Scores for " << stu.name << ":\n";

-

因为stu.name是一个 string对象,所以它将调用 operatot << (ostream &,const string &)函数,该函数
位于string类中。注意,operator << (ostream & os,const Student & stu)必须是Student类的友元函数,这样才
能访问name成员。另一种方法是,在该函数中使用公有方法Name(),而不是私有数据成员name。
同样,该函数也可以使用valarray的 << 实现来进行输出,不幸的是没有这样的实现;因此,Student类
定义了一个私有辅助方法来处理这种任务:

文章来源:https://blog.csdn.net/Popcorn_zyh/article/details/135761413
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。