C++学习之对象成员篇
2016-01-13 16:21
267 查看
对象成员特点总结:
(1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数。
(2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的析构函数。
(3)如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B(原因:因为实例化A时,会先执行B的构造函数,再执行A的构造函数,如若对象B没有默认构造函数,即需要给B的构造函数传递参数才能调用,但是此时A的构造函数还没有执行,因此它还拿不到A构造函数的参数,所以先调用B的构造函数这个过程将无法进行。而初始化列表会先于构造函数的执行对对象成员进行初始化,因此不必再担心B的构造函数拿不到参数而无法执行的问题。因此如果B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B.)
类A和B的关系就好比是汽车和零部件的关系,实例化类A就相当于产生汽车的过程,肯定要先生产零部件再组装生成汽车,因此构造的时候先构造对象成员类B,再构造类A。
销毁对象就跟销毁汽车的过程类似,必须先销毁汽车才能取其零部件,因此先调用类A的析构函数销毁类A,再销毁其对象成员类B。
具体由下面的代码演示,可直接RUN。
#include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y):m_iX(x),m_iY(y)
{
cout<<"Coordinate() "<<m_iX<<","<<m_iY<<endl;
}
~Coordinate()
{
cout<<"~Coordinate() "<<m_iX<<","<<m_iY<<endl;
}
// 打印坐标的函数
void printInfo()
{
cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
}
public:
int m_iX;
int m_iY;
};
class Line
{
public:
Line(int x1,int y1,int x2,int y2):m_coordA(x1,y1),m_coordB(x2,y2)
{
cout<<"Line()"<<endl;
}
~Line()
{
cout<<"~Line()"<<endl;
}
void printAB()
{
cout<<"("<<m_coordA.m_iX<<","<<m_coordA.m_iY<<")"<<endl;
cout<<"("<<m_coordB.m_iX<<","<<m_coordB.m_iY<<")"<<endl;
}
public:
Coordinate m_coordA;
Coordinate m_coordB;
};
int main(void)
{
Line * line = new Line(1,2,3,4);
line->printAB();
delete line;
return 0;
}
运行结果如下:
(1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数。
(2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的析构函数。
(3)如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B(原因:因为实例化A时,会先执行B的构造函数,再执行A的构造函数,如若对象B没有默认构造函数,即需要给B的构造函数传递参数才能调用,但是此时A的构造函数还没有执行,因此它还拿不到A构造函数的参数,所以先调用B的构造函数这个过程将无法进行。而初始化列表会先于构造函数的执行对对象成员进行初始化,因此不必再担心B的构造函数拿不到参数而无法执行的问题。因此如果B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B.)
类A和B的关系就好比是汽车和零部件的关系,实例化类A就相当于产生汽车的过程,肯定要先生产零部件再组装生成汽车,因此构造的时候先构造对象成员类B,再构造类A。
销毁对象就跟销毁汽车的过程类似,必须先销毁汽车才能取其零部件,因此先调用类A的析构函数销毁类A,再销毁其对象成员类B。
具体由下面的代码演示,可直接RUN。
#include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y):m_iX(x),m_iY(y)
{
cout<<"Coordinate() "<<m_iX<<","<<m_iY<<endl;
}
~Coordinate()
{
cout<<"~Coordinate() "<<m_iX<<","<<m_iY<<endl;
}
// 打印坐标的函数
void printInfo()
{
cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
}
public:
int m_iX;
int m_iY;
};
class Line
{
public:
Line(int x1,int y1,int x2,int y2):m_coordA(x1,y1),m_coordB(x2,y2)
{
cout<<"Line()"<<endl;
}
~Line()
{
cout<<"~Line()"<<endl;
}
void printAB()
{
cout<<"("<<m_coordA.m_iX<<","<<m_coordA.m_iY<<")"<<endl;
cout<<"("<<m_coordB.m_iX<<","<<m_coordB.m_iY<<")"<<endl;
}
public:
Coordinate m_coordA;
Coordinate m_coordB;
};
int main(void)
{
Line * line = new Line(1,2,3,4);
line->printAB();
delete line;
return 0;
}
运行结果如下:
Coordinate() 1,2 Coordinate() 3,4 Line() (1,2) (3,4) ~Line() ~Coordinate() 3,4 ~Coordinate() 1,2
相关文章推荐
- C++内存泄露检查
- c++动态分配二维/三维数组的内存
- C++ 局部类
- C++ 嵌套类
- C语言通过逻辑运算(与或非)实现加法
- C++学习之对象数组篇
- C风格字符串与C++风格字符串
- 也谈C++中char*与wchar_t*之间的转换
- 单链表结点删除 C语言实现
- TinyXML:一个优秀的C++ XML解析器
- 重学C++ (五) 函数
- Google C++命名规范
- C语言贪心算法,关于零钱取整问题
- 【C语言提高52】链表的基本操作
- c/c++笔记
- C/C++ void及void指针
- C、C++动态分配函数暨几种参数传递疑难解析
- C++中的 virtual destructor
- C++中的虚函数表
- C++ Primer Plus 学习笔记(三)--编程练习6