首页 > 其他分享 >当构造与析构的函数体为空,会发生什么?

当构造与析构的函数体为空,会发生什么?

时间:2024-08-27 19:50:49浏览次数:11  
标签:体为 调用 函数 与析构 成员 默认 析构 构造函数

析构函数、构造函数用来进行数据的销毁和初始化。那么系统默认生成的构造和析构有什么特点呢?

构造函数

对于自定义类型,会调用对应的默认构造,内置类型不做处理。

当显式定义了无参的默认构造,初始化列表和函数体都为空时,也会在初始化列表阶段调用自定义类的默认构造(所有成员变量都要经历初始化列表)。

在C++中,如果你定义了一个类A,它包含自定义类型B和C的成员,当你创建A的实例并使用A()这样的默认构造函数时,编译器会隐式调用B和C的默认构造函数(如果它们存在的话)来初始化A中的B和C成员。

class B {
public:
    B() { // 默认构造函数
        // 初始化B...
    }
};

class C {
public:
    C() { // 默认构造函数
        // 初始化C...
    }
};

class A {
public:
    B b;  // B类型的成员
    C c;  // C类型的成员

    A() { // A的默认构造函数
        // 构造函数体为空,但初始化列表会调用B和C的默认构造函数
    }
};

在这个例子中,当你执行 A a; 时,会发生以下步骤:

  1. 分配内存以容纳A类型的对象。

  2. 调用B的默认构造函数来初始化成员b。

  3. 调用C的默认构造函数来初始化成员c。

  4. 执行A的默认构造函数体(在这个例子中,它是空的)。

 先走初始化列表,所有成员都会经历初始化列表阶段,然后再走函数体。

在C++中,对于内置类型(如int, float, double等)的成员变量,如果在类的构造函数中没有显式地初始化它们,那么这些内置类型的成员将不会被初始化。它们的值将是未定义的,这意味着它们可能包含内存中的任何垃圾值。

析构函数

默认生成的析构函数根据成员变量,按照它们在类中声明的相反顺序被调用。即,最后声明的成员变量首先被销毁

在如下的代码中,析构函数被显式定义。

class CustomType {
public:
    ~CustomType() {
        // 自定义析构函数,负责释放资源
    }
};

class MyClass {
public:
    CustomType customMember; // 自定义类型的成员

    // 默认生成的析构函数
    ~MyClass() {
        // customMember的析构函数会被自动调用
    }
};

即使内部显示实现了MyClass的析构函数,即使该析构函数的函数体为空,编译器也会自动为MyClass的成员customMember调用其析构函数。在C++中,类的析构函数负责释放对象拥有的资源,对于类类型的成员,编译器会在类的析构函数中自动插入代码来调用这些成员的析构函数。

解释:

MyClass的对象超出作用域或者通过delete操作符被销毁时,MyClass的析构函数会被调用。在这个析构函数中,编译器生成的代码会自动调用customMember的析构函数,无论MyClass的析构函数体是否为空。

如果在析构函数的函数体进行一些其他操作,还会自动调用CustomType的析构吗?

答案是会的!

即使在析构函数的函数体中进行了其他操作,编译器仍然会自动调用CustomType的析构函数。C++编译器会在执行析构函数的函数体中的代码之前或之后(具体顺序取决于成员变量的声明顺序),插入对成员变量析构函数的调用。

class MyClass {
public:
    CustomType customMember; // 自定义类型的成员

    // 显示实现的析构函数
    ~MyClass() {
        // 这里可以执行其他操作
        // ...
        
        // 编译器会在函数体的末尾(或者成员声明顺序的逆序)自动调用customMember的析构函数
    }
};

析构函数的调用顺序遵循以下规则:

  1. 执行析构函数体内的代码。
  2. 按照成员变量在类中声明的逆序,自动调用每个成员变量的析构函数。

因此,即使在析构函数中执行了其他操作,编译器也会保证成员变量的析构函数被正确调用,从而确保了资源被正确释放。这是C++语言的一个特性,以确保对象析构时的资源管理。

对于内置类型(如int, float, double等):

  1. 不调用析构函数:内置类型不需要析构函数,因为它们不涉及资源管理。默认生成的析构函数不会对内置类型的成员变量执行任何特殊操作。

  2. 值销毁:当内置类型的成员变量所在的类实例被销毁时,这些成员变量的值会被简单地销毁。这意味着它们的存储空间会被释放,但不会有特殊的析构逻辑

此外,系统默认生成的赋值重载与拷贝构造,都会进行浅拷贝。

标签:体为,调用,函数,与析构,成员,默认,析构,构造函数
From: https://blog.csdn.net/2302_80190394/article/details/141574702

相关文章

  • C语言字符函数和字符串函数的详解及模拟实现(超详细)
    目录1.求字符串长度1.1strlen1.1.1.strlen函数介绍1.1.2.strlen函数模拟实现 2.长度不受限制的字符串函数 2.1strcpy2.1.1.strcpy函数介绍2.1.2.strcpy函数模拟实现 2.2strcat2.2.1.strcat函数介绍2.2.2.strcat函数模拟实现 2.3strcmp 2.3.1.strcmp函数介绍......
  • C++趣味实验之:二次函数面积与微积分
    在数学中,我们可以使用微积分来计算由二次函数抛物线构成的图形根据这个原理,我们可以用程序模拟计算这些图形的面积longdoublex,y,a,b,c;首先,定义出函数的各个参数输入a,b,c的数值后,计算其数值并绘制其图像for(inti=1;i<=1000;i++){ x+=0.1; y=a*x*x; y=y+b*x; ......
  • ES6的Map函数详解
    一、Map介绍Map对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值Map对象是键值对的集合。Map中的一个键只能出现一次;它在Map的集合中是独一无二的。Map对象在for…of循环在每次迭代后会返回一个形式为[key,value]的数组......
  • C++学习随笔——C++仿函数的应用方法
    仿函数的基本定义仿函数(Functor),也称为函数对象(FunctionObject),是一个行为像函数的对象。实现仿函数的方法是重载类中的operator()操作符,使得对象能够像调用普通函数一样使用。仿函数的主要优势是它们可以拥有状态,并且可以被用于STL算法和容器中。简单例子:点击查看代码#in......
  • 仓颉函数调用语法糖
    尾随lambda尾随lambda可以使函数的调用看起来像是语言内置的语法一样,增加语言的可扩展性。当函数最后一个形参是函数类型,并且函数调用对应的实参是lambda时,我们可以使用尾随lambda语法,将lambda放在函数调用的尾部,圆括号外面。例如,下例中我们定义了一个myIf函......
  • 类内默认生成的函数
    一、构造函数的调用规则构造函数的调用时机:当创建类的对象时,构造函数会被自动调用。使用new分配对象内存时直接在栈上或全局/静态存储区创建对象。构造函数的特点:构造函数的名字必须与类名完全相同。构造函数没有返回类型,连void也不写。构造函数可以有参数,也可......
  • C++学习 — 函数
    目录1.概述2.函数的定义3.函数的调用4.值传参5.函数的常见样式6.函数的声明7.函数的分文件编写8.函数默认参数 9.函数占位参数10.函数重载(1)函数重载概述(2)函数重载注意事项1.概述作用:将一段经常使用的代码封装起来,减少重复代码   一个较大的程序,一般......
  • 探索C语言中数组作为函数参数的奥秘
    在C语言的世界里,数组是一种基础且强大的数据结构,它允许我们存储相同类型的数据集合。然而,在处理函数和数组的关系时,尤其是在数组作为函数参数传递时,初学者往往会感到困惑。今天,我们就来深入探讨这一话题,通过具体的代码示例来揭开其神秘面纱。数组作为函数参数的两种形式在C语......
  • 【Go函数详解】二、参数传递、变长参数与多返回值
    文章目录一、传递参数1.按值传参2.引用传参2.1特殊情况2.1.1切片slice2.1.2字典map二、变长参数1.基本定义和传值1.1基本定义1.2传值1.2.1普通传值1.2.2传递切片2.任意类型的变长参数(泛型)三、多返回值1.命名返回值一、传递参数1.按值传参Go语......
  • 桌面窗体工具类库 - C#小函数类推荐
          此文记录的是检测桌面窗体的小函数。/***桌面窗体工具类库AustinLiu刘恒辉ProjectManagerandSoftwareDesignerE-Mail:[email protected]:http://lzhdim.cnblogs.comDate:2024-01-1515:18:00说明:用......