C++中的成员对象
原文链接: 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++中的成员对象的更多相关文章
- UML类图中的关系和表示方法
类图是用来描述程序中的类以及它们之间的关系的,使用类图可以帮助我们简化对系统的理解.在UML类图中比较常见的关系有六种,它们分别是:依赖.关联.聚合.组合.泛化.实现,这六种关系中类之间的紧密程度是依 ...
- Java中final的用法总结
1. 修饰基础数据成员的final 这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰为常量,意味着不可修改.如java.lang.Math类中的PI和E是f ...
- java中final用法
1.修饰基础数据成员 这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰成常量,不可修改. 2.修饰类或者对象的引用的final 在java中我们无法让对象被修饰为final ...
- UML类图中的关系表示
UML类图中的关系和表示方法 类图是用来描述程序中的类以及它们之间的关系的,使用类图可以帮助我们简化对系统的理解.在UML类图中比较常见的关系有六种,它们分别是:依赖.关联.聚合.组合.泛化.实现,这 ...
- C++ 成员对象和封闭类
01 成员对象与封闭类 类里有其他对象则该对象叫成员对象:有成员对象的类叫 封闭类: class CTyre // 轮胎类 { public: // 有参数构造函数 // 初始化成员变量m_radiu ...
- java中的volatile和synchronized
关于volatile和同步相关的东西,网上有太多错误和解释不清的东西, 所以查阅相关书籍和文章后总结如下, 如果还是也存在不正确的内容,请一定要指出来, 以免误人子弟:) 1. 原子性与可视性 原子性 ...
- Java编程思想—读书笔记(更新中)
第1章 对象导论 1.4 被隐藏的具体实现 访问控制的原因: 让客户端程序员无法触及他们不应该触及的部分(不是用户解决特定问题所需的接口的一部分) 允许库设计者可以改变类内容的工作方式而不用担心会影响 ...
- UML类图(下):关联、聚合、组合、依赖
前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
随机推荐
- WIN10系统如何取消右下角的通知菜单,通知图标
鼠标左键单击通知按钮,然后点击所有设置 在通知和操作页面,取消勾选所有的通知 建议选择在任务栏显示哪些图标,然后勾选显示所有图标
- [UIView setShowsFPS:]: unrecognized selector sent to instance XXX
今天在做sprite Kit game时遇到一个问题. 新建一个项目运行时发现就加了这几句代码无法运行.后来一查原来是storyboard uiview要改一下.改成SKview In your st ...
- loadscript加载
function load_script(xyUrl, callback){ var head = document.getElementsByTagName('head')[0]; var scri ...
- SQL Server 之 附加数据库出现“ 拒绝访问 ”
错误信息如下图所示,附加数据库时出现“拒绝访问”: 解决方案: 修改拒绝访问的文件的安全权限,这里是修改数据库的.mdf文件的安全权限.
- PAT《数据结构学习与实验指导》实验项目集 2-09 2-10 2-11 2-12 2-13
pat 2-09 装箱问题模拟 #include<cstdio> #include<set> #include<vector> using namespace st ...
- Selenium2(webdriver)入门之TestNG的安装与简单使用
上一篇已经搭建好了Eclipse+selenium2的环境,这一篇主要记录下TestNG的使用. 一.在Eclipse中安装TestNG 1.打开eclipse-->help-->Inst ...
- 保密员(baomi)
#include<iostream> #include<string> #include<stdio.h> #include<algorithm> #i ...
- 安装 LUA
为了以后方便,记录一下步骤 1.yum install readline-devel 2.wget http://www.lua.org/ftp/lua-5.1.4.tar.gz 3.cd lua-5 ...
- OpenCV实现任意大小图片的合并(转)
OpenCV实现图像合并主要有两种方法 方法一:使用Mat.push_back方法将列数相同的图像加到最后一行 方法二: 主要思路是将图像拷贝到待合并图像的感兴趣区域 (1)新建一个要合并的图像(容器 ...
- 亲历H5移动端游戏微信支付接入及那些坑(二)——获取Openid和授权
第一篇中将一些坑说明,那么这篇开始正式进入接入步骤.具体的参数说明,我不会列出,毕竟微信官方文档都有,我想大家都看的懂,而且这接口也有可能微信会变动,所以不列出来,也是不想引起大家的误解,接入步骤只起 ...