C++类成员构造函数和析构函数顺序示例详细讲解

C++中类成员的构造函数和析构函数顺序是一个重要的问题。理解正确的顺序可以避免代码出现意外的问题。在这里,我们会详细讲解C++类成员构造函数和析构函数顺序的相关知识。

构造函数和析构函数的顺序

C++中类成员的构造函数和析构函数的顺序如下:

  1. 首先,会调用基类的构造函数(如果有的话)。
  2. 然后,会调用成员变量的构造函数(按照它们在类中的声明顺序调用)。
  3. 最后,调用自身的构造函数。

在析构时的顺序是相反的,即:

  1. 首先,调用自身的析构函数。
  2. 然后,调用成员变量的析构函数(按照它们在类中的声明顺序相反的顺序调用)。
  3. 最后,调用基类的析构函数(如果有的话)。

示例说明

接下来,我们会使用两个示例来说明构造函数和析构函数的顺序。

示例一

#include <iostream>

class Base
{
public:
    Base()
    {
        std::cout << "Base::Base()" << std::endl;
    }
    ~Base()
    {
        std::cout << "Base::~Base()" << std::endl;
    }
};

class MemberVariable
{
public:
    MemberVariable()
    {
        std::cout << "MemberVariable::MemberVariable()" << std::endl;
    }
    ~MemberVariable()
    {
        std::cout << "MemberVariable::~MemberVariable()" << std::endl;
    }
};

class Derived : public Base
{
public:
    Derived()
    {
        std::cout << "Derived::Derived()" << std::endl;
    }
    ~Derived()
    {
        std::cout << "Derived::~Derived()" << std::endl;
    }

private:
    MemberVariable member_;
};

int main()
{
    Derived derived;
    return 0;
}

输出结果为:

Base::Base()
MemberVariable::MemberVariable()
Derived::Derived()
Derived::~Derived()
MemberVariable::~MemberVariable()
Base::~Base()

从输出结果可以看出,构造函数按照规定的顺序被调用,先调用Base类的构造函数,再调用成员变量的构造函数,最后调用自身的构造函数。析构时调用的顺序正好相反。

示例二

#include <iostream>

class String
{
public:
    String(const char* str)
        : len_(strlen(str))
        , str_(new char[len_ + 1])
    {
        strcpy_s(str_, len_ + 1, str);
        std::cout << "String::String()" << std::endl;
    }

    ~String()
    {
        delete[] str_;
        std::cout << "String::~String()" << std::endl;
    }

private:
    size_t len_;
    char* str_;
};

class Person
{
public:
    Person(const char* name)
        : name_(name)
    {
        std::cout << "Person::Person()" << std::endl;
    }
    ~Person()
    {
        std::cout << "Person::~Person()" << std::endl;
    }

private:
    String name_;
};

int main()
{
    Person person("tianxia");
    return 0;
}

输出结果为:

String::String()
Person::Person()
Person::~Person()
String::~String()

从输出结果可以看出,成员变量的构造函数先被调用,然后是自身的构造函数。在析构时,先调用自身的析构函数,然后是成员变量的析构函数。

总结

在C++中,类成员的构造函数和析构函数的顺序比较重要,正确的理解可以避免代码出现意外的问题。在构造时,会按照先调用基类构造函数,再调用成员变量构造函数,最后调用自身构造函数的顺序进行调用;在析构时,会按照先调用自身析构函数,然后调用成员变量析构函数(按照它们在类中的声明顺序相反的顺序调用),最后调用基类析构函数(如果有的话)的顺序进行调用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类成员构造函数和析构函数顺序示例详细讲解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • freertos实时操作系统临界段保护开关中断及进入退出

    Freertos(Free Real-Time Operating System)是一款开源的实时操作系统,可在嵌入式系统中使用。在使用Freertos时,尤为需要注意其临界段保护机制,以确保数据在多任务并发执行时的正确性。下面将详细讲解如何开启临界段保护、如何开关中断、以及进入和退出临界段的方法。 一、开启临界段保护 在单核处理器中,开启临界段保护需要关闭…

    other 2023年6月27日
    00
  • linux编译

    Linux编译 在 Linux 系统中编译源码是常见的操作,可以用于安装应用程序、内核模块等。本文将介绍在 Linux 系统中编译源码的基本步骤和注意事项。 步骤 第一步:下载源码 要编译源码,首先需要下载源代码包。可以从开发者的网站或者项目的源代码仓库中下载到源代码包。 第二步:安装编译工具 在编译源码之前,需要在系统中安装编译工具。一般情况下,gcc 和…

    其他 2023年3月29日
    00
  • C语言循环控制入门介绍

    C语言循环控制入门介绍 在C语言中,循环控制语句是非常常用的,它可以使相同的代码块多次执行,从而简化程序的编写。C语言有三种循环控制语句:while、do-while和for,本文将为您介绍循环控制的基础知识和语法,以及几个常见的用法。 while循环 while循环控制语句是C语言中最基本的一种循环控制语句,它的基本语法如下: while(conditio…

    other 2023年6月27日
    00
  • vue3封装echarts组件最佳形式详解

    下面我会详细讲解“vue3封装echarts组件最佳形式详解”的完整攻略。 一、背景介绍 在使用Vue3框架进行开发的过程中,我们经常会使用到echarts组件来实现数据的可视化展示。但是,直接使用echarts官方提供的API进行开发,会使代码十分冗余,不利于复用和维护。因此,封装一个通用的echarts组件是十分必要的。 二、封装思路 对于封装一个通用的…

    other 2023年6月25日
    00
  • 后缀名为.csh是什么文件?

    后缀名为.csh的文件是一种脚本文件,通常用于在Unix和类Unix系统上执行C Shell(csh)脚本。C Shell是一种命令行解释器,它提供了一些与Bourne Shell(sh)不同的语法和功能。 要理解.csh文件的含义,我们可以按照以下步骤进行: 了解C Shell(csh):C Shell是一种Unix Shell,它提供了一种与用户交互的方…

    other 2023年8月5日
    00
  • MySQL数据库配置信息查看与修改方法详解

    MySQL是一种常用的关系型数据库管理系统,管理员或者开发人员经常需要查看和修改MySQL数据库的配置信息。本文将详细讲解MySQL数据库配置信息的查看和修改方法,旨在帮助读者更好地管理和操作MySQL数据库。 查看MySQL数据库配置信息 要查看MySQL数据库的配置信息,可以通过以下步骤进行: 登录MySQL数据库 打开终端或命令提示符,输入以下命令登录…

    other 2023年6月25日
    00
  • iPhone11屏幕严重偏黄怎么办 屏幕偏黄亮度不足解决方法

    iPhone11屏幕严重偏黄怎么办 如果你的iPhone11屏幕呈现严重的偏黄现象,不仅影响了手机的使用体验,而且还可能让你感到担忧。不用担心,下面我将提供两种方法帮你解决这个问题。 方法一:检查Night Shift模式 很多用户在使用iPhone时,会选择在晚上开启Night Shift模式,这种模式将屏幕颜色逐渐变为暖色调,以减少可能导致眼疲劳的蓝光辐…

    other 2023年6月27日
    00
  • oracle 声明游标(不具备字段)规则应用

    Oracle 声明游标可以用于处理一组结果集,其中不具备字段的情况下,我们需要使用游标的规则来获取数据。以下是 Oracle 声明游标(不具备字段)的完整攻略: 步骤1:声明游标 在声明游标的时候,需要设置一个非游标记录,以便能够正确地访问结果集。采用以下格式: DECLARE cursor_name SYS_REFCURSOR; BEGIN OPEN cu…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部