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. SpringBoot:CORS处理跨域请求的三种方式

    一.跨域背景 1.1 何为跨域? Url的一般格式: 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 示例: https://www.dustyblog.cn:8080/say/Hel ...

  2. c博客06-结构体&文件

    1.本章学习总结 1.1 学习内容总结 结构体的定义.成员的赋值: 结构体的一般定义形式(单独定义): struct 结构名 { 类型名 结构体成员名1; 类型名 结构体成员名2; ... 类型名 结 ...

  3. 单个div元素实现双边框

    昨天被问到一个很有意思的问题,单个div元素怎么实现双边框,当时脑子懵了一下,然后就回答出来用伪元素,别的实在是想不起来了,所以在此总结一下子防止以后再被问到 总结了一下大约有以下几种方案: 伪元素实 ...

  4. 深入理解 Java 异常

  5. PostgreSQL update set from 两表联合更新,注意与其它数据库更新语法有差别

    最近用PostgreSql数据库进行表关联更新时,发现与之前用的Sql Server 和My Sql语法有很大差别,稍微不注意,很容易出错. PostgreSql表更新时,两个表只允许一个表起别名,一 ...

  6. JS-字符串截取方法slice、substring、substr的区别

    一.使用 slice() 截取 1,函数说明 slice() 方法可通过指定的开始和结束位置,提取字符串的某个部分,并以新的字符串返回被提取的部分.语法如下: stringObject.slice(s ...

  7. kali安装openvas

    参考: https://blog.51cto.com/linhong/2134910?source=drh https://www.freebuf.com/sectool/133425.html ht ...

  8. 最常见的 Git 问题和操作清单汇总

    最常见的 Git 问题和操作清单汇总 引言 本文整理自工作多年以来遇到的所有 Git 问题汇总,之前都是遗忘的时候去看一遍操作,这次重新整理了一下,发出来方便大家收藏以及需要的时候查找答案. 一.必备 ...

  9. U盘的几种分类及格式

    u盘常见的几种分类: 1.按u盘材质来分,可以分为金属u盘.塑料u盘.软胶u盘.皮革u盘.木质u盘.珠宝u盘等.这些主要是考虑u盘本身外壳所用材质的. 2.从u盘容量来分,就是8GB.16GB.32G ...

  10. window2012安装oracle报INS-13001 环境不满足最低要求

    在windows server 2012R2安装Oracle客户端或者服务端时,会弹窗报错INS-13001 环境不满足最低要求此时可以进行以下操作进行解决 在解压后的Oracle安装文件目录中,找到 ...