C++对象数组和成员对象
2017-04-20 20:16
260 查看
》对象数组
对象数组是指数组元素为对象的数组,该数组中的每一个元素都是同一个类的对象。
定义格式:
<类名><数组名>[<大小>].... 例: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;
} 程序运行结果:
![](https://img-blog.csdn.net/20170420223830959?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFya3hpYW9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
由于软件原因析构函数无法截图:
Destructor of example:4
Destructor of counter:4
Destructor of counter:0
Destructor of example:0
Destructor of counter:0
Destructor 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的析构过程与此相同。
对象数组是指数组元素为对象的数组,该数组中的每一个元素都是同一个类的对象。
定义格式:
<类名><数组名>[<大小>].... 例: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:4
Destructor of counter:4
Destructor of counter:0
Destructor of example:0
Destructor of counter:0
Destructor 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++入门 (六) 类对象数组和静态成员
- 2013级C++第4周(春)项目——再和对象找感觉【项目4 - 数组作数据成员】
- 【C++基础学习】成员对象与对象数组
- C++之对象数组+对象成员+拷贝构造函数(深/浅)
- C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误
- java学习(12)对象数组初始化 java与C++的区别
- C++对象指针、对象成员和对象成员指针
- c++复习之对象数组
- C++对象模型中数据成员与继承
- C++构造,析构,友元类,对象,static成员,复制构造函数,运算符重载杂谈
- C++中 const对象和非const对象与const成员的关系
- 明明白白c++之类的基本操作(c++ primer 的读书笔记 ,类对象, 类用户, 类成员的含义)
- 【C++】深度探索C++对象模型之虚拟成员函数(virtual member function)
- 深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
- C++本类可以访问本身类的私有成员(即拷贝构造函数可以访问本身对象的私有成员)
- c++对象成员函数返回自身引用时出现的诡异问题及解决办法
- 21天学通c++之第二周 指针 8.6 访问自由存储区中对象的成员数据