首页 > 编程语言 >C++类的构造函数和析构函数

C++类的构造函数和析构函数

时间:2024-03-25 11:29:05浏览次数:24  
标签:初始化 obj 函数 C++ 析构 MyClass 和析构 构造函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


1. 构造函数(Constructor)

**定义:**构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。
特点:

  • 和类同名,没有返回类型。
  • 可以有多个构造函数,根据参数的不同进行重载。
  • 如果没有显式定义构造函数,编译器会提供默认构造函数。

作用:

  • 初始化对象的数据成员。
  • 分配资源(如动态内存分配)。

示例:

class MyClass {
public:
    // 默认构造函数
    MyClass() {
        // 初始化代码
    }

    // 带参数的构造函数
    MyClass(int value) {
        // 初始化代码
    }
};

2. 析构函数(Destructor):

定义: 析构函数是用于在对象生命周期结束时进行清理工作的特殊成员函数。
特点:
与类同名,前面加上~符号,没有返回类型。
在对象被销毁时自动调用。
通常用于释放资源(如动态分配的内存)。
作用:
清理对象所占用的资源。
执行必要的清理操作,如关闭文件、释放内存等。
示例:

class MyClass {
public:
    // 析构函数
    ~MyClass() {
        // 清理代码
    }
};

3. 构造函数与析构函数的调用顺序:

构造函数:
基类构造函数先于派生类构造函数调用。
成员变量按照它们在类中声明的顺序初始化。
析构函数:
派生类析构函数先于基类析构函数调用。
成员变量的销毁顺序与初始化相反。

4. 注意事项:

构造函数不能被继承,但会自动调用基类的构造函数。
析构函数可以是虚函数,通常应该将基类的析构函数定义为虚析构函数,以确保正确释放资源。


5. 示例

当涉及到类的构造函数和析构函数时,让我们通过一个简单的示例来说明它们的用法和作用。

#include <iostream>
class MyClass {
private:
    int* data; // 一个动态分配的整数数组

public:
    // 构造函数:用于初始化对象
    MyClass() {
        data = new int[5]; // 动态分配一个包含5个整数的数组
        std::cout << "Constructor called" << std::endl;
    }

    // 析构函数:用于清理对象占用的资源
    ~MyClass() {
        delete[] data; // 释放动态分配的数组内存
        std::cout << "Destructor called" << std::endl;
    }

    void setData(int index, int value) {
        data[index] = value;
    }

    void displayData() {
        for (int i = 0; i < 5; i++) {
            std::cout << data[i] << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    MyClass obj; // 创建一个MyClass对象,调用构造函数

    obj.setData(0, 10);
    obj.setData(1, 20);
    obj.setData(2, 30);
    obj.setData(3, 40);
    obj.setData(4, 50);

    obj.displayData();

    return 0; // 在main函数结束时,MyClass对象将被销毬,调用析构函数
}

在这个示例中,我们定义了一个MyClass类,其中包含构造函数和析构函数。构造函数用于动态分配一个包含5个整数的数组,而析构函数用于释放该数组的内存。在main函数中,我们创建了一个MyClass对象,调用构造函数进行初始化,并且在main函数结束时,会自动调用析构函数来清理对象占用的资源。

总结

构造函数和析构函数在C++中起着至关重要的作用,正确使用它们可以确保对象的正确初始化和清理,避免资源泄漏和内存泄漏问题。希望以上说明能帮助你更好地理解构造函数和析构函数的作用和用法。

标签:初始化,obj,函数,C++,析构,MyClass,和析构,构造函数
From: https://blog.csdn.net/followtheheart/article/details/137008977

相关文章

  • C++开发基础——类对象与构造析构
    一、基础概念类:用户自定义的数据类型。对象:类类型的变量,类的实例。类的成员:成员变量和成员函数。成员变量:类中定义的变量。成员函数:类中定义的函数。定义类的代码样例:classClassName{//members};//类定义的右花括号后面必须有分号类的访问修饰符:public、private......
  • C++开发基础——指针与引用
    一,关于指针1.指针的基础概念指针是可存储地址的变量,存储在指针中的地址可以是变量或者其他数据的地址。指针不仅仅是指向某地址,指针还关注指向该地址的数据类型。例如:long*num_ptr{};这里的num_ptr指针今后只能存储long类型的变量地址,尝试用它存储非long类型的变量地址......
  • C/C++练习
    1.数组升序#include<iostream>usingnamespacestd;//冒泡排序voidbubbleSort(int*arr,intlen){ for(inti=0;i<len-1;i++){ for(intj=0;j<len-1-i;j++){ if(arr[j]>arr[j+1]){ inttmp=arr[j]; arr[j]=arr[j+......
  • C++ 类的内存分配是怎么样的?
    dynamic_memory首先通过一段代码来引入动态内存分配的主题。一个名为StringBad的类以及一个功能更强大的String类。#include<iostream>#ifndefSTRNGBAD_H_#defineSTRNGBAD_H_classStringBad{private: char*str; intlen; staticintnum_strings;public: StringB......
  • C++ 设计模式
    C++设计模式工厂模式:我们需要方便的使用这些类,减少耦合度#include<iostream>#include<string>usingnamespacestd;classcar{public:car(stringname):name_(name){}virtualvoidshow();protected:stringname_;};classaodi:publiccar{public: aod......
  • LeetCode第390场周赛题解(c++)
    真的无语了,早上怎么都提交不了,显示未知错误。。。结果晚上就可以提交了。唉100245.每个字符最多出现两次的最长子字符串给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的 最大 长度。示例1:输入: s="bcbbbcba"输出: 4解释:以......
  • c++十大排序——快速排序
    1#include<iostream>usingnamespacestd;voidquickSort(intarr[],intbegin,intend){ if(begin>=end)return; intleft=begin; intright=end; inttemp=arr[left]; while(left<right){ //从后往前找比他小的放前面,从前往后找比它大的放后......
  • 【C++】每日一题 452 用最少数量的箭引爆气球
    有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组points,其中points[i]=[xstart,xend]表示水平直径在xstart和xend之间的气球。你不知道气球的确切y坐标。一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有......
  • 初识C++(二)引用,内联函数,auto
    目录1.引用的概念与用法:1.1引用特性:1.2使用场景    1.2.1做参数1.3传值、传引用效率比较1.4引用做返回值1.5引用和指针的对比2.内联函数3.auto关键字4.基于范围的for循环(C++11)5.指针空值nullptr(C++11)1.引用的概念与用法:    引用是一个重要的......
  • 代码解析 C++ 的语法难点
    C++是一种强大的编程语言,它提供了丰富的语法特性,但也带来了相应的语法难点。本文将深入解析C++中一些常见的语法难点,并提供清晰的解释和示例,帮助读者深入理解C++的语法。1.指针和引用指针和引用都是C++中处理内存地址的强大工具,但它们也容易混淆。指针指向内存地......