原文链接: http://blog.csdn.net/rhzwan123/article/details/2105205

【概念】

成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。概括的说,就是一个类的成员是一个对象,即成员对象。

例如:

#include<iostream>
using namespace std;

class Date{  ...};  //创建一个对象Date,类体略

class Time
{ Date d1 , d2;};  //创建一个对象Time,该对象有两个数据成员d1和d2,这两个成员是Date类的两个对象

在这个例子中,Time的成员d1和d2是Date的对象,那么d1和d2就是成员对象。

【要求】

1、出现成员对象时,该类的构造函数要包含对成员的初始化。如果构造函数的成员初始化列表没有对成员对象初始化时,则使用成员对象的缺省构造函数。

如上例中的Time中,有两个成员对象d1和d2,那么在Time类的构造函数中,就应该包含对d1和d2的初始化,这个初始化通常采用成员初始化列表的方式进行。

构造函数对成员对象初始化列表的格式为:

<类名>::<类名>(<总参数表>):<成员对象1>(<形参表1>), <成员对象2>(<形参表2>),……

{ //函数体 }

如上例的Time类的构造函数可以这样定义:
<Time>::<Time>(int m):d1(m),d2(5);    //如果在类体内定义,则省略<Time>::
   {   ...    }

该例中d1被初始化为d1(m),d2被初始化为d2(5).

再如:
<Time>::<Time>(int m):d1(m)     //如果在类体内定义,则省略<Time>::
   {   ...    }

该例中d1被初始化为d1(m),d2未被初始化.

2、建立一个类的对象时,应先调用其构造函数。但是如果这个类有成员对象,则要先执行成员对象自己所属类的构造函数,当全部成员对象都执行了自身类的构造函数后,再执行当前类的构造函数。

如上例修改如下:

#include<iostream>
using namespace std;

class Date

 public:
 Date( ){ cout<<"This is Date"<<endl; }      //Date的缺省构造函数
 Date(int A) { cout<<"The value="<<A<<endl; };
 
class Time
 {  
   public:
    Time( ) {cout<<"This is Time"<<endl;  //Time的缺省构造函数
    Time(int A):d2( A )   //Time的构造函数。采用成员初始化列表的方式,成员对象d1的形参未初始化
   ,将成员对象d2的形参初始化为A
   {
        cout<<"Hello!"<<endl;
   }
   private:
   Date d1 , d2;        //在Time中声明两个数据成员d1和d2,这两个成员是Date类的两个对象,即d1和d2是成员对象
};

void main( )
  {
     Time t1, t2(6);   //注释1
     cout<<"The end"<<endl;
  }

注释1:

主程序运行到Time t1 , t2时,会检查Time类中是否有成员对象,检查中根据Date d1 , d2;  发现有成员对象d1和d2,就先执行d1和d2对应的Date类中的构造函数,然后再执行Time中的构造函数。
具体步骤为:

(一)在创建t1对象(无参数)时,按下列步骤进行:
1、执行d1所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date;
2、执行d2所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date;
3、执行t1所属类Time的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is time;

(二)在创建t2对象(有参数)时,按下列步骤进行:
4、执行d1所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date.
5、执行d2所属类Date的构造函数,根据Time中 Time(int A):d2(A); 发现d2已经被初始化为d2(A),在这里即为d2(6),由此则需要调用Date类的构造函数Date(int A),输出 The value= .
6、执行t2所属类Time的构造函数,t2的重载函数应为Time(int A),输出 Hello.

C++中的成员对象的更多相关文章

  1. UML类图中的关系和表示方法

    类图是用来描述程序中的类以及它们之间的关系的,使用类图可以帮助我们简化对系统的理解.在UML类图中比较常见的关系有六种,它们分别是:依赖.关联.聚合.组合.泛化.实现,这六种关系中类之间的紧密程度是依 ...

  2. Java中final的用法总结

    1.         修饰基础数据成员的final 这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰为常量,意味着不可修改.如java.lang.Math类中的PI和E是f ...

  3. java中final用法

    1.修饰基础数据成员 这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰成常量,不可修改. 2.修饰类或者对象的引用的final 在java中我们无法让对象被修饰为final ...

  4. UML类图中的关系表示

    UML类图中的关系和表示方法 类图是用来描述程序中的类以及它们之间的关系的,使用类图可以帮助我们简化对系统的理解.在UML类图中比较常见的关系有六种,它们分别是:依赖.关联.聚合.组合.泛化.实现,这 ...

  5. C++ 成员对象和封闭类

    01 成员对象与封闭类 类里有其他对象则该对象叫成员对象:有成员对象的类叫 封闭类: class CTyre // 轮胎类 { public: // 有参数构造函数 // 初始化成员变量m_radiu ...

  6. java中的volatile和synchronized

    关于volatile和同步相关的东西,网上有太多错误和解释不清的东西, 所以查阅相关书籍和文章后总结如下, 如果还是也存在不正确的内容,请一定要指出来, 以免误人子弟:) 1. 原子性与可视性 原子性 ...

  7. Java编程思想—读书笔记(更新中)

    第1章 对象导论 1.4 被隐藏的具体实现 访问控制的原因: 让客户端程序员无法触及他们不应该触及的部分(不是用户解决特定问题所需的接口的一部分) 允许库设计者可以改变类内容的工作方式而不用担心会影响 ...

  8. UML类图(下):关联、聚合、组合、依赖

    前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...

  9. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

随机推荐

  1. zoj 2876 Phone List

    #include <stdio.h> #include <string.h> #include <stdlib.h> #define ZERO 0 const in ...

  2. Mac os 系统头像位置。

    ~/Library/Containers/com.apple.ImageKit.RecentPictureService/Data/Library/Images/Recent Pictures/

  3. 【Ubuntu】Ubuntu bug “Reached target Shutdown”

    在使用 Ubuntu-16.04.3-server-amd64.iso 版本(参考官方,iso下载地址)的时候,遇到一个Ubuntu的Bug,后来查了一下,在官方看到,目前还是Unassigned: ...

  4. JS 处理Json数据事例

    JS从远端获取数据之后,往往还需要在处理一下,下面给出一个事例,供参考 将'[{"role_id":1,"enable":1},{"role_id&q ...

  5. word2013总是出现未响应卡一下如何解决?

    最近在记笔记,word很烦很烦,总是会卡一下,过一会卡一下.本来以为是自动保存后来发现跟自动保存没有关系. 解决方法:禁用硬件图形加速就好了,不行的话再在硬件加速下面有个"使用子像素定位平滑 ...

  6. 解决ODI 12C Studio 运行缓慢问题

    一.配置 ODI 12C Studio 1.1 修改ODI Studio process的-Xms和-Xmx ide.conf: modifying the initial Heap size (-X ...

  7. 【Linux】Ubuntu13.10 设置静态ip地址

    vim /etc/network/interfaces # interfaces() ) and ifdown() auto eth0 iface eth0 inet static address 2 ...

  8. MVC5为WebAPI添加命名空间的支持1

    前言 默认情况下,微软提供的MVC框架模板中,WebAPI路由是不支持Namespace参数的.这导致一些比较大型的项目,无法把WebApi分离到单独的类库中. 本文将提供解决该问题的方案. 微软官方 ...

  9. SpringCloud之搭建配置中心

    一.搭建config-server 1.引入pom <dependencies> <dependency> <groupId>org.springframework ...

  10. JAVA内存模型及垃圾回收自我总结

    本文为原创,根据<深入理解java虚拟机>和自己的一些理解进行整理,单纯和看其他人的博客感觉不如自己一点点的画和记录来的印象深刻. JAVA内存模型: 上图中:局部变量表所需的内存在编译期 ...