C++对象数组和成员对象
来源:互联网 发布:最新网络名词英文 编辑:程序博客网 时间:2024/04/27 06:20
》对象数组
对象数组是指数组元素为对象的数组,该数组中的每一个元素都是同一个类的对象。
定义格式:
<类名><数组名>[<大小>].... 例:date dates[5];
使用对象数组成员的格式:
<数组名>[<下标>].<成员名> 例:dates[0].year
注:数组元素的更新有两种方式:
#用一个已知的对象进行更新
#直接生成一个新的对象进行更新
示 例:
dates[3]=date(5,25,2002);
等价于
date temp(5,25,2002); //建立一个匿名对象temp
dates[3]=temp;
释放temp;
这里隐含了三步操作:首先,以更新后的值作为参数生成一个匿名对象;其次,将匿名对象赋值给数组元素对象;最后,在赋值操作完成后,匿名对象的生存期结束,调用析构函数释放该匿名对象。
注:析构函数的执行顺序与构造函数的执行顺序相反。
》成员对象
类的数据成员可以是简单类型或自定义类型的变量,也可以是类类型的对象。因此,可以利用已定义的类来构成新的类,使得一些复杂的类可以由一些简单类组合而成。类的聚集描述的就是一个类使用其他类的对象作为成员的情况。
当一个类的成员是另外一个类的对象时,该对象就称为成员对象。当类中出现了成员对象时,该类的构造函数要包含对成员对象的初始化,成员对象的初始化工作也是在成员初始化列表中完成的。
初始化的一般格式:
<类名>::<类名>(<总形参表>):<成员对象1>(<形参表1>),<成员对象2>(<形参表2>),...
{
......
}
建立一个类的对象时,要调用它的构造函数对类对象初始化,此时应先执行初始化列表对各个成员进行初始化,再执行当前类的构造函数体。如果类中包含有成员对象,注意要根据初始化的参数调用成员对象的构造函数对其进行初始化。析构函数的执行顺序与构造函数的执行顺序相反。
在对成员对象初始化时,根据初始化列表的特点可知:类中有多个成员对象时,要按照定义成员对象的顺序建立各个子对象,即成员对象构造函数的执行顺序仅与成员对象在类中声明的顺序有关,而与成员初始化列表中给出的成员对象的顺序无关。如果在构造函数的成员初始化列表中没有给出对成员对象的初始化,则表示使用成员对象的默认构造函数。如果成员对象所在的类没有默认构造函数,将产生错误。
示 例:
#include<iostream>using namespace std;class counter{public:counter():val(0){cout<<"Default constructor of counter"<<endl; }counter(int x):val(x){cout<<"Constructor of counter:"<<val<<endl; }~counter(){cout<<"Destructor of counter:"<<val<<endl; }private:int val;};class example{public:example():val(0){cout<<"Default constructor of example"<<endl; }example(int x):c2(x),val(x){cout<<"Constructor of example:"<<val<<endl; }~example(){cout<<"Destructor of example:"<<val<<endl; }void print()const{cout<<"value="<<val<<endl; }private:counter c1,c2;int val;};int main(){example e1,e2(4);e2.print();system("pause");return 0; }程序运行结果:
由于软件原因析构函数无法截图:
Destructor of example:4Destructor of counter:4Destructor of counter:0Destructor of example:0Destructor of counter:0Destructor of counter:0
类example中存在counter类的成员对象从c1,c2.建立example类的对象时,要先对成员对象c1,c2以及成员val进行初始化。这些成员对象的初始化在类example的构造函数的初始化列表中进行,成员初始化工作完成后,在执行example的构造函数体。
在建立example类的对象e1时,由于没有提供参数,因此应调用example类的默认构造函数。example类的默认构造函数的初始化列表为空,表示对全部三个数据成员进行默认初始化,其中调用了成员对象c1,c2的默认构造函数,因此输出Default constructor of counter;Default constructor of counter;Default constructor of example。在建立e2对象时,对成员对象c1的初始化也使用了默认构造函数。
由于类example中同时存在两个成员对象,因此应该按照声明成员对象的顺序对这两个成员对象进行初始化,即应先对成员对象c1进行初始化,在对成员对象c2进行初始化。
在主程序结束时,要调用两个对象e1,e2的析构函数。析构函数的执行顺序与构造函数的执行顺序相反,即先析构e2对象,在析构e1对象。e2对象中包含有成员对象,它必须负责成员对象c1,c2的析构,析构顺序也与建立e2对象时的顺序相反,即先析构e2对象,在析构成员对象c2,最后析构成员对象c1。e1的析构过程与此相同。
- C++-类对象成员&&对象数组
- C++对象数组和成员对象
- 对象数组&对象成员
- C++---对象数组和对象指针
- 【C++】const对象和const成员
- C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟
- 转:(C++)对象成员数组初始化/赋值讨论
- C++入门 (六) 类对象数组和静态成员
- js获取数组元素个数和对象成员数
- C++对象指针、对象成员和对象成员指针
- Objective-c 数组对象 (NSArray 和 NSMutableArray)
- Objective-C---4---数组和值对象
- c/c++整理--静态成员和临时对象
- 对象数组和指向对象的指针 指向类成员的指针
- 对象数组和指向对象的指针 指向类成员的指针
- 对象数组和指向对象的指针 指向类成员的指针
- 常对象和常对象成员
- 对象数组【c++】
- qt连接mysql数据库以及txt文本的复制操作
- java <<(左移位) 与 >>(右移位)
- CF
- bootstrap-datetimepicker的引入
- STL初步 lower_bound & upper_bound UVa 10474
- C++对象数组和成员对象
- CenOS7安装Opentext Process Platform实践之平台篇
- 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)
- JAR文件使用
- API.Management rest api基础知识大全电子书
- Qt'中foreach的实现
- 归一化积相关算法(NProd)原理及代码
- qq55938241此人是骗子
- 查询每个订单中订单明细中只支付了部分或为支付的订单