一组合二继承和派生三派生类的声明和对象定义.ppt
《一组合二继承和派生三派生类的声明和对象定义.ppt》由会员分享,可在线阅读,更多相关《一组合二继承和派生三派生类的声明和对象定义.ppt(26页珍藏版)》请在三一文库上搜索。
1、1,一、组 合 二、继承和派生 三、派生类的声明和对象定义,第18章 组合和继承,2,一、组 合 1. 组合的概念 C+中组合是指结构和类的声明嵌入结构变量或对象作 为其成员的现象。嵌入的对象成员亦称为成员对象,包容这 个成员对象的类可称为组合类或包容类。 当构造一个组合类的对象时,系统首先为每一个数据成 员分配内存空间,仅当其中的成员对象获得完备的内存时才 导致组合类实例的诞生。 编译器先调用嵌入对象的构造函数,然后调用组合类的 构造函数。,3,嵌入对象所隶属的类或嵌入类对应既定的事物,组合类 对应某种新生的事物。 C+中一个重要的思想是先构造既定的对象,然后构造 新生的对象。 这也适应继承
2、的情况,先构造基类再构造派生类。但析 构的次序与构造相反,先诞生的对象后撤离内存空间。 对象的构造和析构遵循堆栈空间先进后出的原理。,4,2. 引用型成员和const成员 类中允许存在引用型数据成员和const数据成员。引用 应依附于另一个独立的变量,等待及时的初始化。Const数 据成员是仅仅初始化一次其值便不再改变的数据成员。 对于存在const型的不变成员或引用型成员,系统提供 的缺省的赋值运算符函数不起作用。引用型成员和不变成员 只能借助冒号语法初始化。,5,当基于内存数据共享而设置引用型成员的时候,应注意 引用型成员应关联到一个具有独立的生存期长或等长的同类 型变量。 具有const
3、成员的对象预埋一个不变的成员,这样的类 是一个奇怪的类,因此编编程时应仔细加以处理。 下面的例子为简单见嵌入一个内置int类型的引用型成 员和不变成员,通过该例说明构造函数初始化列表的语法格 式。,6,例 CType内含int类型的引用型成员和const成员 #include static int numc=0; class CType public: CType (int x=1,int y=2); CType:CType (); private: int n; const int c; public: int ,7,CType:CType (int x,int y) :r(y), c(x)
4、 n=x; printf (“%d. n=%d,r=%d CType (int,int);“, +numc,n,r); CType g; void main() printf (“Enter into main()n“); CType x (3,4); printf (“x.r=%dn“,x.r); printf (“Go outof main() n“); ,8,/程序运行输出结果: 1. n=1,r=2 CType(int,int);Enter into main() 2. n=3,r=4 CType(int,int);x.r=4 2. n=3,r=4199100 CType:CType(
5、);Go outof main() 1. n=1,r=-858993460 CType:CType(); 此题输出一个不可靠的结果。原因在于: y是一个函数入口堆栈空间的局部变量,r是一个生存期 由对象控制的引用型成员。 将引用型成员关联到生存期短的局部变量是危险的。,9,3. 嵌入对象的初始化 嵌入对象所属类最好存在显式或隐含的可访问的缺省构 造函数,从而可被编译器自动隐含调用。下面的规则描述嵌 入对象显式的初始化: a.组合类的构造函数显式调用嵌入对象自身的带参构 造函数,这一调用是通过冒号初始化语法进行的。 b. 嵌入对象按照其在组合类中的声明次序调用自身的 构造函数,而不是冒号语法列表
6、中出现的次序。 c. 嵌入对象的构造函数对于组合类是可访问的,可访 问的含义是或者嵌入对象的构造函数是公共的,或者组合类 声明为嵌入类的友员类等。,10,例 嵌入类和组合类的对象生灭 #include static int num=0; class CEmbed public: int n; CEmbed (int ,int ); private: int ,11,class CContain public: CEmbed a; CContain (int x=1,int y=2); private: const CEmbed b; ; CContain:CContain(int x,int
7、y):b(y,y),a(x,x) printf (“%d.a=%d, b=%d, CContain (int,int); n“,+num, a.n,b.n); void main() CContain z (3,4); /输出: 1. n=3, CEmbed(int,int); 2. n=4, CEmbed(int,int); 3.a=3,b=4, CContain(int,int);,12,4. 冒号初始化语法 冒号初始化是对象定义时调用构造函数进行初始化的一 种方式 。构造函数冒号初始化语法的一般格式为: 类名:类名(形参列表):引用型成员(左值), 嵌入对象(实参列表),const型成员
8、(右值), 其它成员初始化; 例如: CEmbed (int x, int y): m_r (n) . CContain (int x,int y):a (x,x),b (y,y) .,13,该语法的格式是在类的构造函数表题头后紧跟冒号 “:”,冒号之后是成员对象的构造函数初始化调用列表,各 列表分项之间以逗号分隔,但不构成先后求值的语义。 每一个嵌入成员对象采用函数对象名语法显式调用自身 的构造函数,对于简单变量也采用构造函数的形式,不采用 等号形式的初始化。 冒号之后的列表全部省略时对应编译器隐含调用成员对 象可访问的缺省构造函数,这是编译器的默认设置。 构造函数中形参作用域始于冒号处止于
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 组合 继承 派生 声明 对象 定义
链接地址:https://www.31doc.com/p-2660271.html