• 【C++】构造函数与析构函数用途 ( 代码示例 - 构造函数与析构函数用途 )






    一、构造函数与析构函数



    在 C++ 语言中 , " 构造函数 " 和 " 析构函数 " 都是 C++ 类中的 特殊函数 , 分别用于

    • 初始化对象
    • 销毁对象 ;

    C++ 类 在创建 实例对象 时自动调用 构造函数 这个特殊函数 , 其主要作用是 初始化对象的成员变量 , 如果需要 可以 执行其他必要的操作 ;

    • 构造函数 的名称与类的名称相同 ;
    • 构造函数 没有返回类型 ;
    • 构造函数 可以带有参数 , 也可以不带参数 ;

    C++ 类 在 销毁 实例对象 时自动调用 析构函数 这个特殊函数 , 其主要作用是 销毁释放对象的成员变量 , 如果需要 可以 执行其他必要的操作 ;

    • 析构函数 的名称 是 ~ 加上 类的名称 ;
    • 析构函数 没有返回类型 ;
    • 析构函数 不带参数 ;




    二、代码示例 - 构造函数与析构函数用途



    在下面的代码中 :

    C++ 类 Student 类 有 2 个 public 共有成员变量 ,

    public:
    	int age;
    	char* name;
    
    • 1
    • 2
    • 3

    在 构造函数 中 , 需要初始化这两个成员变量 , 其中涉及到为 char* name 指针 在堆内存 分配内存 , 并为其设置 初始化值 ;

    在 构造函数 中 , 使用 malloc 函数 , 为 name 指针分配 100 字节内存 ,

    // 为 name 成员分配内存
    name = (char*)malloc(100);
    
    • 1
    • 2

    构造函数 中 , 为 name 指针 , 分配完内存后 , 确保指针分配成功的前提下 , 为 name 指针指向的内存进行赋值 , 这里使用 strcpy_s 函数 , 拷贝字符串到 name 内存中 , 注意 “Tom” 字符串占 4 字节 , 除了 3 个实际字母外 , 还有一个 \0 字符串结尾 , 第二个参数 设置的 值 必须 大于等于 4 , 否则会报错 ;

    // 为 name 成员设置字符串值
    if(name != NULL)
    {
    	strcpy_s(name, 4, "Tom");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上述 构造函数 没有设置参数 , 构造函数 是可以设置 若干参数的 , 为构造函数 传入参数 , 对成员变量 进行初始化 , 也是常用操作之一 ;


    在 析构函数 中 , 只需要将 name 指针进行销毁即可 , 销毁前确保 name 指针不为空 , 否则会存在导致运行时崩溃的隐患 ;

    // 销毁 name 指向的堆内存空间
    if (name != NULL)
    {
    	free(name);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    完整代码示例 :

    #include "iostream"
    using namespace std;
    
    class Student
    {
    public:
    	Student()
    	{
    		// 为 name 成员分配内存
    		name = (char*)malloc(100);
    
    		// 为 name 成员设置字符串值
    		if(name != NULL)
    		{
    			strcpy_s(name, 4, "Tom");
    		}
    		
    		// 为 age 成员设置初始值
    		age = 18;
    
    		cout << "调用构造函数" << endl;
    	}
    
    	~Student()
    	{
    		// 销毁 name 指向的堆内存空间
    		if (name != NULL)
    		{
    			free(name);
    		}
    		cout << "调用析构函数" << endl;
    	}
    
    public:
    	int age;
    	char* name;
    };
    
    int main()
    {
    	// 声明 Student 类型实例对象
    	Student s1;
    
    	// 打印 Student 实例对象值
    	cout << "name : " << s1.name << " , age : " << s1.age << endl;
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    代码示例 : 执行 main 函数 时 , Student s1 时 自动调用 Student 类构造函数 , main 函数执行完毕退出程序时 , 自动调用 Student 析构函数 , 销毁对象 ;

    调用构造函数
    name : Tom , age : 18
    Press any key to continue . . .
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    Docker & Mysql实战:docker compose 搭建Mysql
    深入 Qt5 信号槽新语法
    CSS清除浮动
    python 字符串(str)、列表(list)、元组(tuple)、字典(dict)
    vue入门,从启动项目开始,做完得物App的用户登录(前端!)
    node连接mongoose数据库流程
    TensorFlow和CUDA、cudnn、Pytorch以及英伟达显卡对应版本对照表
    意外发现一款很好用的开源BI工具——DataEase
    请体验一下falcon 180b 大语言模型的感觉
    Spring——Spring基础介绍
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132805445