===============================================
未完待续,转载时请表明出处:
http://www.cofftech.com/thread-1398-1-1.html
欢迎大家跟帖讨论哈~~~~~
===============================================
以前提到,当一个类的对象用作另一个类的数据成员时,称为对象成员或子对象(sub-object)。包含子对象的 类被称为复合类(composite class)。这种功能称为复合(composition)。
例如:
class A
{
……
};
class B
{
A a;
……
};
其中class B中的成员a(即class A的对象)是子对象。子对象也需要初始化,而这也要依靠初始化列表。
[例1]初始化列表将子对象初始化
#include <iostream.h>
class sub_class
{
int a;
double d;
public:
sub_class (int j, double m)
{ a = j; d = m; }
void sub_show( )
{ cout<<"sub-object data: "<<a<<" and "<<d<<endl; }
};
class comp_class
{
int x;
sub_class sub_obj;
public:
comp_class (int a, int b, double d) : x(a), sub_obj(b, d) { }
void show( ) { sub_obj.sub_show( );
cout<<"comp-object datum: "<<x<<endl; }
};
void main()
{
comp_class objp(123, 456, 98.76);
objp.show( );
}
/* Result:
sub-object data: 456 and 98.76
comp-object datum: 123
*/
[例2]初始化列表将多个子对象初始化
// initab_5.cpp
// initialization of two sub-objects
#include <iostream.h>
class sub_class {
int x;
public:
sub_class (int a) { x = a; } //defining the constructor
void display( ) { cout<<x<<endl; }
};
class comp_class {
int y;
sub_class sub_obj_1; // a data member
sub_class sub_obj_2; // another data member
public:
comp_class (int a, int b, int c); //declaring the constructor
void display_comp( ) { cout<<"comp_class::y : "<<y<<endl; }
void display_sub_1( ) { cout<<"sub_obj_1.x : "; sub_obj_1.display( ); }
void display_sub_2( ) { cout<<"sub_obj_2.x : "; sub_obj_2.display( ); }
};
comp_class::comp_class (int a, int b, int c):sub_obj_1(b), sub_obj_2(c)
// constructor with initialization table
{
y = a;
}
void main()
{
comp_class obj(10, 20, 30);
obj.display_comp();
obj.display_sub_1();
obj.display_sub_2();
}
/* Results:
comp_class::y : 10
sub_obj_1::x : 20
sub_obj_2::x : 30
*/
注意:初始化列表中只能使用子对象名sub_obj_1和sub_obj_2而不能用类名,因一个类可能产生多个子对象。
分享到:
相关推荐
《Visual C++程序设计学习笔记随书源码》是一份宝贵的学习资源,涵盖了从第二章到第十二章的完整内容,由刘春辉和徐健飞两位专家编著,出版于电子工业出版社。这个压缩包包含了一系列与Visual C++编程相关的源代码,...
- 构造函数是类的一个特殊成员函数,用于初始化新创建的对象。在题目中提到了Copy构造函数,它在对象以值传递或返回时被调用,用于创建对象的副本。浅拷贝(shallow copy)仅复制对象的直接成员,而不复制动态分配...
- **构造函数**:用于初始化对象的状态。 - **析构函数**:在对象生命周期结束时被调用,用于释放资源。 #### 名字空间 - **定义**:用于组织代码,避免命名冲突。 - **作用域**:可以定义局部或全局的名字空间。 ...
1. **单继承的内存模型**:每个派生类对象都会有一个额外的指针,指向其基类子对象。这种方式简单但可能导致派生类对象的大小受基类影响。 2. **多继承的基类表模型**:为了解决多继承带来的问题,每个类对象都指向...
- 全局/静态存储区:全局变量和静态变量存储在这里,无论是否初始化。 - 自由存储区:通过`malloc`和`free`分配和释放的内存,有时也称为堆区。 - 栈区:存放函数参数和局部变量,自动分配和释放,按后进先出(LIFO...
### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...
为了实现一个启动时不自动创建子窗口的多重文档界面(Multiple Document Interface,简称MDI)程序,可以通过修改`CWinApp`派生类的初始化函数来达到目的。具体步骤如下: 1. **在App类的初始化函数中**,通常是在`...
**C++ GUI Qt4 编程 学习笔记** 在深入探讨C++使用Qt4进行图形用户界面(GUI)编程之前,我们先了解Qt库的基本概念。Qt是一个跨平台的应用程序开发框架,由挪威Qt公司(原属于诺基亚)开发,支持Windows、Linux、...
构造函数用于初始化新创建的对象,而析构函数在对象生命周期结束时被调用,用于清理资源。这些函数的名字与类名相同,但构造函数无返回类型,析构函数为void类型。 5. **指针与引用** 指针是C++中强大的工具,它...
通过讲解this关键字、继承、static关键字和代码块、final关键字、多态、方法重写、抽象类与接口、封装与隐藏、垃圾回收、类组合、包装类、对象处理、类成员、final修饰符详解等知识点,本文档为Java学习者提供了一套...
- **构造方法**:用于初始化新创建的对象。 - **类方法和实例方法**:类方法可以直接通过类名调用,而实例方法则需要通过对象调用。 - **4.3 对象** - **创建对象**:使用new关键字创建对象。 - **使用对象**:...
在对王健伟老师的Linux C++网络编程课程进行辅助学习时,工程思维导图作为一种图形化思维工具,可以帮助学生更系统地理解和掌握复杂的知识点。这份资料中提到的内容涉及到网络编程的多个关键概念和实现细节,下面将...
从C++11开始,C++引入了许多新特性,如右值引用、lambda表达式、自动类型推断(auto关键字)、统一的初始化方式、移动语义等,这些都极大地提升了C++的现代性和易用性。 **总结** 本C++电子教案的PPT形式将深入...
其中,setup() 函数在程序开始运行时执行一次,用于初始化设置;loop() 函数则包含了主要的程序逻辑,并且会不断地循环执行。 在数据类型方面,Arduino定义了常量和变量。常量是在程序运行过程中其值不可更改的数据...
这篇学习笔记将引导你了解如何配置Cocos2d-x的开发环境以及基础的使用方法。 ### 一、COCOS2D-X 下载与安装 1.1 **开发环境的安装与环境变量的设置** - **JDK的安装与路径设置**:首先,你需要安装Java ...
### 一、C++ 中变量初始化的重要性 在 C++ 编程语言中,初始化变量是非常重要的一个步骤。这是因为未初始化的变量可能会导致不可预测的行为,比如程序崩溃或者产生错误的结果。例如,在代码片段中提到:“1C++У鲢...
此外,高级主题如STL(标准模板库)、异常处理、智能指针和RAII(资源获取即初始化)技术也是现代C++编程中不可或缺的部分。 其次,.ppt文件通常用于教学演示,可能包含有关C++语言的幻灯片,涵盖了从基础到高级的...
### Visual C++从入门到精通(第二版)的要点笔记 #### 文档类(CWinGreetDoc) 文档类在Microsoft Foundation Classes (MFC)框架中扮演着关键角色,主要负责存储程序的数据以及数据的读取和写入操作。此类在MFC...