当前位置: 首页 > news >正文

【C++】C++构造函数与析构函数

文章目录

  • 构造函数
    • 构造函数概述
    • 复制构造函数
  • 析构函数

构造函数

构造函数概述

当类的实例进入其作用域,也就是建立一个对象时,就会调用构造函数。
那么,构造函数的作用是什么呢?当建立一个对象时,常常需要做某些初始化工作,例如,对数据成员赋值,设置类的属性等,而这些操作刚好在构造函数中完成。

定义:构造函数是与类同名的特殊成员函数,没有返回值(包括void)。
调用:构造函数在创建对象时自动调用,不能被显式调用。
重载:可以定义多个构造函数(构造函数重载),以支持不同的初始化方式。

默认构造函数:
不带参数的构造函数。
如果没有定义任何构造函数,编译器会自动提供一个默认构造函数。
示例:

class Point
{
public:
    Point()
    { // 默认构造函数
        x = 0;
        y = 0;
    }
    int x, y;
};

带参数的构造函数:
接受参数以初始化对象的属性。
示例:

class Point
{
public:
    Point(int xVal, int yVal)
    { // 带参数的构造函数
        x = xVal;
        y = yVal;
    }
    int x, y;
};

复制构造函数

在开发程序时可能需要保存对象的副本,以便在后面执行的过程中恢复对象的状态。那么,如何使用已经初始化的对象来生成一个一模一样的对象呢?答案是使用复制构造函数来实现。复制构造函数的参数是一个已经初始化的类对象。
使用复制构造函数,代码如下:

#include < iostream >
#include "Person.h"
using namespace std;
int main()
{
    CPerson p1(20, 30, 100);
    CPerson p2(p1);
}

程序中先使用带参数的构造函数声明对象p1,然后通过复制构造函数声明对象p2。因为p1已经是初始化完成的类对象,所以它可以作为复制构造函数的参数。

析构函数

构造函数和析构函数是类体定义中比较特殊的两个成员函数,因为它们都没有返回值,而且构造函数名标识符和类名标识符相同,析构函数名标识符就是在类名标识符的前面加上“~”符号。

构造函数主要用来在创建对象时,给对象中的一些数据成员赋值,目的就是初始化对象。析构函数是用来释放对象的,在删除对象前,用它来做一些清理工作。析构函数的功能与构造函数的功能正好相反。

#include <iostream>
#include <cstring>

class Student
{
public:
    // 默认构造函数
    Student(const char *name, int age)
    {
        // 动态分配内存并复制字符串
        this->name = new char[strlen(name) + 1];
        strcpy(this->name, name);
        this->age = age;
    }

    // 析构函数
    ~Student()
    {
        std::cout << "Destructor called for: " << name << std::endl;
        delete[] name; // 释放动态分配的内存
    }

    // 显示学生信息
    void display() const
    {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }

private:
    char *name; // 动态分配的字符串
    int age;
};

int main()
{
    {
        Student student1("Alice", 20); // 创建一个对象
        student1.display();            // 输出: Name: Alice, Age: 20
    } // student1的作用域结束,析构函数会被调用

    {
        Student student2("Bob", 22); // 创建另一个对象
        student2.display();          // 输出: Name: Bob, Age: 22
    } // student2的作用域结束,析构函数会被调用

    return 0;
}

使用析构函数的注意事项如下:
在一个类中只可能定义一个析构函数。
析构函数不能重载。
构造函数和析构函数不能使用return语句返回值。不用加上关键字void。

构造函数和析构函数的调用环境如下:
(1)自动变量的作用域是某个模块,当此模块被激活时,自动变量调用构造函数;当退出此模块时,会调用析构函数。
(2)全局变量在进入main()函数之前会调用构造函数,在程序终止时会调用析构函数。
(3)动态分配的对象使用new为对象分配内存时会调用构造函数;使用delete删除对象时会调用析构函数。
(4)临时变量是为了支持计算,由编译器自动产生的。在临时变量生存期的开始和结尾会调用构造函数与析构函数。

相关文章:

  • 使用 Ollama 本地部署 DeepSeek 模型及 Chatbox 配置
  • poetry安装与使用
  • IoTDB日志提示Too many open files
  • 华为总部-华为东莞松山湖基地参观游学攻略
  • ragflow 默认端口被占用,更改端口号
  • C# MethodBase 类使用详解
  • 蓝桥每日打卡--区间移位
  • ReentranLock手写
  • Three.js中的加载器与资源管理:构建丰富3D场景的关键
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 RESTful API 设计:从上手到骨折
  • Oracle 常用语法汇总
  • Hinton提出的知识蒸馏(Knowledge Distillation,简称KD):原理解释和代码实现
  • LeetCode 解题思路 23(Hot 100)
  • 炫酷的3D按钮效果实现 - CSS3高级特性应用
  • 线性代数(期末周救济)--笔记1
  • 中文文献去哪里查找,个人下载知网、万方、维普文献途径
  • HFSS 使用指南 —— 新手项目完整实现步骤
  • C/C++错误信息
  • 【第19节】windows sdk编程:文件I/O
  • 前缀和算法的应用
  • 2人恶意传播刘国梁谣言被处罚,媒体:以法律利剑劈谣斩邪,加快推进依法治体
  • 摄影师|伊莎贝尔·穆尼奥斯:沿着身体进行文化溯源
  • 习近平向多哥新任领导人致贺电
  • 美叙领导人25年来首次会面探索关系正常化,特朗普下令解除对叙经济制裁
  • 为何选择上海?两家外企提到营商环境、人才资源……
  • 从能源装备向应急装备蓝海拓展,川润股份发布智能综合防灾应急仓