C++学习之对象成员篇

对象成员特点总结:

(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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值