C++中类的组合与构造函数

来源:互联网 发布:linux安装yum 编辑:程序博客网 时间:2024/06/01 10:43

首先看看构造函数的概念。在程序执行过程中,当遇到对象声明语句时,程序会想操作系统申请一定的内存空间用于存放新建的对象。而编译器不知道如何产生代码来实现初始化。所以C++做了一套对象初始化的机制,就是构造函数。

然后是类的组合中,当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。和上面的解释来看,创建的时候就会被分配空间,并且自动调用构造函数来进行初始化。在创建对象时既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员进行初始化。先内嵌对象构造,然后再是本来进行构造。在内嵌对象的构造中,初始化的顺序是根据内嵌对象在类中的声明顺序,而不适合类的初始化列表的顺序。

在组合类的构造中有特殊的情况,比如有些内嵌对象没有在构造函数的初始化列表中,那么该内嵌对象的默认构造函数将会被执行。记住是默认构造函数,如果我们自己重新定义了构造函数的话,这个默认构造函数就不存在了,而默认会调用我们定义的构造函数,并且这个构造函数不能带参数。

然而需要注意的是,有些数据成员的初始化必须在构造函数的初始化列表中进行。一类是没有默认构造函数的内嵌对象—–因为这类对象初始化时必须提供参数,另一类是引用类型的数据成员—–因为引用型变量必须在初始化时绑定引用的对象。引用型变量就是带&的对象声明。

下面看这个例子中让我困惑了半天的地方:
这里写图片描述

在这个例子中首先犯的错是定义了一个Clock带参数的构造函数,但在Clockx中声明了Clock c 确将其添加到Clockx的构造函数列表中,这个时候编译器认为没有构造函数去初始化c。如果参数在列表中,那么意味着c是要靠外部构造好了的对象来复制构造自己。如在main函数中Clock c(“aaa”);已经构造了一个c ,然后将这个c传参到Clockx cx(c)中,则Clockx中的c就被初始化了。Clockx中的c和main中的c是不同作用域的。所以用的时候必须是cx.c.showTime()。

来看另外一个错误:
这里写图片描述
这里Clockxd中声明了Clockd c ,而没有定义带初始化列表的构造函数,那么系统会默认调用Clockd的默认构造函数,而这个默认构造函数被Clockd(const …..)给替代了,所以系统报错。因此需要增加一个名为Clocked(){};的不带参数的构造函数,在能被Clockxd默认构造。
以上几点是《C++语言程序设计》中的知识,在编程中困惑了好久,看来基本功很重要。例子在src/clock.cpp中可以复现。

0 0
原创粉丝点击