C++ 成员对象和封闭类

举报
小林coding 发表于 2021/06/04 00:04:30 2021/06/04
【摘要】 01 成员对象与封闭类 类里有其他对象则该对象叫成员对象;有成员对象的类叫 封闭类; class CTyre // 轮胎类 { public: // 有参数构造函数 // 初始化成员变量m_radius和m_width CTyre(int r, int w):m_radius(r),m_width(w) { } private: int m_radius; // ...

01 成员对象与封闭类

类里有其他对象则该对象叫成员对象;有成员对象的类叫 封闭类

class CTyre  // 轮胎类
{
public: // 有参数构造函数 // 初始化成员变量m_radius和m_width CTyre(int r, int w):m_radius(r),m_width(w) { }
private: int m_radius; // 半径 int m_width;  // 宽度
};

class CEngine // 引擎类
{ // 默认会有无参数构造函数
};

class CCar // 汽车类 -- 封闭类
{
public: // 有参数构造函数 // 对成员变量m_price初始化,对成员对象tyre初始化 CCar(int p, int tr, int tw):m_price(p),tyre(tr,tw){} 
private: int m_price; // 价格 CTyre tyre; // 成员对象 CEngine engine; // 成员对象
};

int main()
{ CCar car(10000,20,50); return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

上例中,如果CCar类不定义构造函数,则会使用默认的无参构造函数,那么下面的语句会编译出错:

CCar car;

  
 
  • 1

因为编译器不明白CCar类中的tyre成员对象该如何初始化。engine成员对象的初始化则没问题呢,因为用默认构造函数即可。

任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。

具体的做法是:通过封闭类的构造函数的初始化列表


02 封闭类构造函数和析构函数的执行顺序

  • 封闭类对象生成时,先执行所有成员对象的构造函数,然后才执行封闭类的构造函数。
  • 成员对象的构造函数执行顺序,与在封闭类定义成员对象的顺序一致。
  • 当封闭类的对象消忙时,只需要记住一句话:先构造的对象,后析构,由于封闭类是最后才被构造的,所以封闭类对象最先析构。
class CTyre // 轮胎类
{
public: CTyre(){ std::cout << "CTyre 构造函数" << std::endl; } ~CTyre(){ std::cout << "CTyre 析构函数" << std::endl; }
};

class CEngine // 引擎类
{
public: CEngine(){ std::cout << "CEngine 构造函数" << std::endl; } ~CEngine(){ std::cout << "CEngine 析构函数" << std::endl; }
};

class CCar // 汽车类 -- 3. 最后构造封闭类对象
{
public: CCar(){ std::cout << "CCar 构造函数" << std::endl; } ~CCar(){ std::cout << "CCar 析构函数" << std::endl; }
private: CTyre tyre; // 1. 先构构造该成员对象 CEngine engine; // 2. 接着构造该成员对象
};

int main()
{ CCar car; return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

执行结果:

CTyre 构造函数
CEngine 构造函数
CCar 构造函数
CCar 析构函数
CEngine 析构函数
CTyre 析构函数

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

03 封闭类的复制构造函数

class A
{
public: // 无参数构造函数 A() { std::cout << "A 构造函数" << std::endl; } // 复制构造函数 A(A & a) { std::cout << "A 复制构造函数" << std::endl; }
};

class B
{ // 若没有声明构造函数和复制构造函数,则编译器会默认生成构造函数和复制构造函数 A a; // 成员对象
};

int main()
{ B b1; // b1对象 和 成员对象a都会执行无参数的构造函数 B b2(b1); // b2对象 和 成员对象a都会执行复制构造函数 return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

输出结果:

A 构造函数
A 复制构造函数

  
 
  • 1
  • 2

文章来源: blog.csdn.net,作者:小林coding,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_34827674/article/details/103303081

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。