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;
}

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

CCar car;

因为编译器不明白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;
}

执行结果:

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

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;
}

输出结果:

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

C++ 成员对象和封闭类的更多相关文章

  1. 封闭类------新标准c++程序设计

      封闭类:  一个类的成员变量如果是另一个类的对象,就称之为“成员对象”.包含成员对象的类叫封闭类. #include<iostream> using namespace std; cl ...

  2. 封闭类和封闭方法(sealed)

    因为所有的类都可以被继承,为了防止类的继承被滥用,C#中提出了密封类的概念. 如果想声明一个类,并且该类不能被其他类所继承.那么使用sealed关键字可以将类和方法封闭起来,使类不能被继承,方法不能被 ...

  3. MOOC C++笔记(三):类和对象提高

    第三周:类和对象提高 this指针 作用 this指针作用就是指向成员函数所作用的对象. 非静态成员函数中可以直接使用this来代表指向该函数作用的指针. 成员函数中默认有一个this指针指向当前对象 ...

  4. C++程序设计——知识点总结

    C++程序设计课程的总结,方便以后快速查阅和复习 Week 2 从C走进C++ 函数指针 函数名是函数的入口地址,指向函数的指针称为"函数指针". 比如,qsort库函数: voi ...

  5. C++程序设计(二)

    1. 类 class CRectangle { public: int w, h; void Init( int w_, int h_ ) { w = w_; h = h_; } int Area() ...

  6. C++笔记(2017/2/9)

    this指针 this指针作用就是指向成员函数所作用的对象. 非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针. 静态成员函数中不能使用this指针. 静态成员 static 定义 ...

  7. c++学习笔记_3

    前言:本笔记所对应的课程为中国大学mooc中北京大学的程序设计与算法(三)C++面向对象程序设计,主要供自己复习使用,且本笔记建立在会使用c和java的基础上,只针对与c和java的不同来写 类和对象 ...

  8. 《新标准C++程序设计》3.6-3.7(C++学习笔记9)

    一.成员对象和封闭类 (1)定义 一个类的成员变量如果是另一个类的对象,就称之为“成员对象”. 包含成员对象的类叫封闭类. (2)封闭类构造函数的初始化列表 在构造函数中添加初始化列表的写法: 类名: ...

  9. Coursera课程笔记----C++程序设计----Week3

    类和对象(Week 3) 内联成员函数和重载成员函数 内联成员函数 inline + 成员函数 整个函数题出现在类定义内部 class B{ inline void func1(); //方式1 vo ...

随机推荐

  1. 【朝花夕拾】Android自定义View篇之(三)Canvas绘制文字

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10968358.html],谢谢! 前面的文章中在介绍Canvas的时候,提到过后续单独讲Can ...

  2. SpringBoot2.0 整合 Shiro 框架,实现用户权限管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Shiro简介 1.基础概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.作为一款安全 ...

  3. Excel的创建和读取NPOI

    项目中经常用到需要操作Excel文件,例如:导出数据库中的数据,读取数据等.但是电脑又没有安装office,不能直接调用微软的库,最后经过查找,找到这样的一个不用安装office的库.一个.NET库, ...

  4. Python自动发送邮件--smtplib模块

    import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText f ...

  5. vue-svgicon基本使用

    在项目开发中,经常会用到svg图标,之前用的都是vue-svg-icon,最近在npm中搜索svg图标解析插件,发现vue-svgicon用的相对较多,对比以下,vue-svgicon用法较为灵活,方 ...

  6. JavaScript基础6

    计时器 setInterval()   按照指定周期来调用函数或计算表达式     以毫秒计算 语法    setInterval(code,millisec[,“lang”]) code 要调用的函 ...

  7. DevOps VS 职责分离

    原文地址: https://medium.com/@jeehad.jebeile/devops-and-segregation-of-duties-9c1a1bea022e 原文作者:Jeehad J ...

  8. go语言设计模式之adapter

    adapter.go package adapter import ( "fmt" ) type LegacyPrinter interface { Print(s string) ...

  9. 最近公共祖先(LCA)基础模板(倍增法)

    之前在澡堂学过这么个东西,听课时理解非常透彻,然后做题时是这种状态: 因为并没有切板子题,最近切掉以后看同桌,他默默地说了一句话: 我是什么时候A的来着... 我当时就心态爆炸... 现在来进行简单整 ...

  10. Global Azure Bootcamp 2019 宁波站活动总结

    4月27日,由微软MVP技术社区发起的Global Azure Bootcamp 2019盛会在全球80多个国家270个城市举办.本次活动由全国众多Azure专家及微软MVP技术社区成员,分别在北京. ...