美文网首页C++基础知识
C++ 成员对象和封闭类

C++ 成员对象和封闭类

作者: 小林coding | 来源:发表于2019-11-28 23:49 被阅读0次

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++ 成员对象和封闭类

    01 成员对象与封闭类 类里有其他对象则该对象叫成员对象;有成员对象的类叫 封闭类; 上例中,如果CCar类不定义...

  • C++——成员对象和封闭类

    有其他类的对象作为 成员对象的类叫封闭类。 任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初...

  • 成员对象和封闭类

    注:以下大部分内容来源于 coursera 课程《C++程序设计》 成员对象: 定义:一个类的成员变量是另一个类的...

  • 慕课网-C++远征之封装篇(下)-学习笔记

    C++远征之封装篇(下) c++封装概述 类 & 对象 对象+数据成员 = 对象成员 对象 + 数组 = 对象数组...

  • C++系列之面向对象

    C++类&对象 C++类定义 类&对象详解 概念描述类成员函数[https://www.runoob.com/cp...

  • 《面向对象程序设计 C++》类数据成员和类成员函数

    类数据成员 C++类中有一种类型成员,属于类本身,而不属于类的对象,这种类型成员成为类成员,而属于对象的成员成为对...

  • C++基础2020-11-09

    C++ 类 & 对象 关键字 public 确定了类成员的访问属性 类的对象的公共数据成员可以使用直接成员访问运算...

  • C++ const用法

    一 修饰类 C++中const修饰类主要包括3个部分:数据成员,成员函数,对象。 数据成员const 修饰类的成员...

  • C++常对象-常函数-常成员变量

    C++常对象-常函数-常成员变量 C++常对象 C++常对象, 就是使用const修饰的类实例!const A a...

  • C++基础(类和构造函数)

    C++基础 类和构造函数 类 类:类是定义同一类所有对象得变量和方法的蓝图或原型。数据与算法的统一。成员成员函数保...

网友评论

    本文标题:C++ 成员对象和封闭类

    本文链接:https://www.haomeiwen.com/subject/tbtwwctx.html