C++分析类的对象作类成员调用构造与析构函数及静态成员

C++中,类对象也可以充当类的成员,这样的类称为分析类或组合类。在分析类的对象作为其他类的成员变量时,需要注意其构造函数、析构函数及静态成员的调用。

构造函数和析构函数的调用

当组合类的对象作为另一个类的成员时,先调用另一个类的构造函数,再调用组合类的构造函数;在调用析构函数时,先调用组合类的析构函数,再调用另一个类的析构函数。

示例1:

class A {
public:
    A() {cout << "A Constructor" << endl;}
    ~A() {cout << "A Destructor" << endl;}
};

class B {
public:
    B() {cout << "B Constructor" << endl;}
    ~B() {cout << "B Destructor" << endl;}
};

class C {
public:
    A a;
    B b;
    C() {cout << "C Constructor" << endl;}
    ~C() {cout << "C Destructor" << endl;}
};

int main() {
    C c;
    return 0;
}

运行结果:

A Constructor
B Constructor
C Constructor
C Destructor
B Destructor
A Destructor

可以看到,先构造A,再构造B,最后构造C;而在销毁对象时,先销毁C,再销毁B和A。

示例2:

class Date {
public:
    int year;
    int month;
    int day;
    Date(int y, int m, int d) : year(y), month(m), day(d) {
        cout << "Date Constructor" << endl;
    }
    ~Date() {cout << "Date Destructor" << endl;}
};

class Employee {
public:
    string name;
    Date birthDate;
    Employee(string n, Date d) : name(n), birthDate(d) {
        cout << "Employee Constructor" << endl;
    }
    ~Employee() {cout << "Employee Destructor" << endl;}
};

int main() {
    Date birthdate(2001, 10, 1);
    Employee employee("Tom", birthdate);
    return 0;
}

运行结果:

Date Constructor
Employee Constructor
Employee Destructor
Date Destructor

可以看到,首先构造Date对象,然后构造Employee对象,最后按相反的顺序销毁对象。

静态成员的调用

静态成员是属于整个类的,其调用方式与一般成员不同。一个类的静态成员只有一份实体,不随对象的生成而生成。

当组合类对象生成时,其静态成员只会初始化一次,而不是针对每个对象分别初始化。当组合类对象被销毁时,其静态成员也不会被销毁,直到整个程序结束。

示例:

class A {
public:
    A() {cout << "A Constructor" << endl;}
    ~A() {cout << "A Destructor" << endl;}
    static int x;
    static void print() {cout << "x=" << x << endl;}
};

int A::x = 1;

class B {
public:
    A a;
    B() {cout << "B Constructor" << endl;}
    ~B() {cout << "B Destructor" << endl;}
};

int main() {
    B b1, b2;
    A::print();
    return 0;
}

运行结果:

A Constructor
B Constructor
A Constructor
B Constructor
x=1
B Destructor
A Destructor
B Destructor
A Destructor

可以看到,静态成员x只被初始化了一次,并且在对象被销毁时没有被销毁。可以通过静态成员函数print,在不创建任何对象的情况下访问静态成员x的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++分析类的对象作类成员调用构造与析构函数及静态成员 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言实现简易文本编译器

    C语言实现简易文本编译器 本攻略将介绍如何使用C语言实现一个简易文本编译器。编译器会将输入的文本文件转换为标准的HTML格式并输出到文件中。 准备工作 在开始之前,你需要安装一个C语言编译器,例如gcc或clang,并确保在你的系统上运行正常。你也需要掌握基本的C语言语法。 构建编译器 首先,我们需要将我们的编译器分为两个部分:词法分析器和语法分析器。 词法…

    C 2023年5月23日
    00
  • C++实现四叉树效果(附源码下载)

    C++实现四叉树效果(附源码下载) 四叉树也称为四元树或者八叉树,是一种树形数据结构,其特点是每个内部节点有四个子节点或是八个子节点。四叉树在计算机图形学和图像处理领域中得到了广泛应用。本文将讲解如何用 C++ 实现四叉树,并提供源码下载。 实现思路 基本概念 四叉树的基本概念是将二维空间划分为四个象限,每个象限为一个节点。每个节点又可以继续向下划分,直到一…

    C 2023年5月23日
    00
  • c语言分离三位数的实现

    C语言分离三位数的实现 问题描述 需要将一个三位数拆分成它的百位、十位、个位并分别输出。 实现思路 首先我们需要得到这个三位数的百位、十位、个位,然后分别输出即可。对于一个三位数$abc$,它的百位是$a$,十位是$b$,个位是$c$。我们可以使用除法和取余两种方式来获取这三个数字。 除法:$a = abc / 100$;$b = abc / 10 \% 1…

    C 2023年5月23日
    00
  • C语言实现控制台五子棋小游戏

    C语言实现控制台五子棋小游戏攻略 1. 准备工作 在开始写代码之前,我们需要进行必要的准备工作,包括: 环境搭建。需要安装C语言开发环境,如Visual Studio等。 学习C语言基础知识。了解C语言基本语法,掌握数组、结构体、指针等常用知识点。 学习控制台操作相关知识。了解如何在控制台输出文字、获取用户输入、清空屏幕等操作。 2. 实现思路 五子棋实现的…

    C 2023年5月23日
    00
  • C语言 while循环

    当我们需要重复执行某个代码块直到满足条件时,可以使用循环语句。C语言提供了三种循环语句:while、for和do-while。其中,while语句用于不确定循环次数的情况。下面是while循环的使用攻略。 while循环基本语法 while循环的基本语法如下: while (condition) { statement; } 其中,condition为循环条…

    C 2023年5月9日
    00
  • 2022最新使用VSCode编译运行C++的过程及会遇到的两个问题

    下面是详细讲解“2022最新使用VSCode编译运行C++的过程及会遇到的两个问题”的完整攻略。 目录 安装VSCode和C++插件 新建C++项目并配置调试环境 编写和运行C++程序 会遇到的两个问题及解决方法 示例说明 总结 1. 安装VSCode和C++插件 首先,我们需要在官网上下载安装 Visual Studio Code 。安装完成后,在 VSC…

    C 2023年5月23日
    00
  • python json.dumps() json.dump()的区别详解

    当我们需要将Python对象转换为JSON字符串时,我们可以使用Python内置的json模块。在使用json模块时,json.dumps()和json.dump()是两个常用的方法。它们之间有明显的区别,请看下文详解。 json.dumps() json.dumps()方法用来将Python对象转换为JSON格式的字符串,并返回生成的字符串,该方法的语法如…

    C 2023年5月23日
    00
  • 浅析VSCode launch.json中的各种替换变量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等

    对于”浅析VSCode launch.json中的各种替换变量的意思”这个话题,以下是我准备好的完整攻略。 1. 简介 在 VSCode 调试过程中,通常需要配置一个 .vscode/launch.json 文件。这个配置文件中包括了很多参数,其中一些参数需要填写变量,这些变量通常用于在不同情况下动态生成参数值。这些变量被称为“替换变量”,是一种非常方便的技…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部