40.构造函数与析构函数

news2025/1/1 16:53:50

目录

1.构造函数

构造函数在以下情况被调用:

构造函数可以具有以下特点:  

下面是一个简单的示例代码,展示了一个类的构造函数的定义和用法:  

构造函数的特征

2.析构函数

析构函数的声明和定义如下:

以下是一个使用析构函数的示例,用于释放动态分配的内存:


放暑假了,欠了很多的帐。今天继续补!!!今天进行了构造函数和析构函数的复习。

1.构造函数

       在C++中,构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。构造函数的名称与类名相同,没有返回类型(包括void),并可以带有参数。

构造函数在以下情况被调用:

  1. 对象被创建时:当使用new运算符创建对象时,构造函数被自动调用。

  2. 对象在栈上被声明时:当在函数内部或作为函数参数时,对象在栈上被声明并分配内存时,构造函数被自动调用。

  3. 对象作为另一个对象的成员时:当对象作为另一个对象的成员时,构造函数被调用以初始化该成员对象。

构造函数可以具有以下特点:  

  1. 可以重载:一个类可以有多个构造函数,它们可以具有不同的参数列表,以允许不同的对象初始化方式。

  2. 可以有默认参数:构造函数的参数可以有默认值,这样在创建对象时可以省略相应的参数。

  3. 可以使用成员初始化列表:构造函数可以使用成员初始化列表来初始化对象的数据成员,以提供更高效的初始化方式。

下面是一个简单的示例代码,展示了一个类的构造函数的定义和用法:  

class MyClass {
private:
    int value;
public:
    MyClass() {
        value = 0; // 默认构造函数,将value初始化为0
    }
    MyClass(int initValue) {
        value = initValue; // 带参数的构造函数,使用传入的值初始化value
    }
    int getValue() {
        return value;
    }
};

int main() {
    MyClass obj1; // 调用默认构造函数
    MyClass obj2(10); // 调用带参数的构造函数
    cout << obj1.getValue() << endl; // 输出: 0
    cout << obj2.getValue() << endl; // 输出: 10
    return 0;
}

在上述示例中,MyClass类定义了两个构造函数:一个是默认构造函数,用于将value初始化为0;另一个是带参数的构造函数,用于接受一个参数并将其用于初始化value

main()函数中,通过创建MyClass的对象并调用其成员函数getValue(),可以获取对象的值并输出到控制台。

构造函数在类的实例化过程中非常重要,它使得对象的创建和初始化成为可能,确保对象在使用之前处于有效的状态。

构造函数的特征

构造函数时特殊的公有成员函数(在特殊用途中构造函数的访问限定可以定义成私有或者保护)

1.函数名与类名相同。

2.构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可写void。实际上 构造函数有返回值,返回的就是构造函数所创建的对象。

3.在程序运行时,当新的对象被建立,该对象所属的类构造函数自动被调用,在该对象生存期中也 只调用这一次。

4.构造函数可以重载。严格地讲,类中可以定义多个构造函数,它们由不同的参数表区分,系统在 自动调用时按一般函数重载的规则选一个执行。

5.构造函数可以在类中定义,也可以在类中声明,在类外定义。

6.如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数:

       但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。只要构造函数是无参的或 者只要各参数均有缺省值的,C++编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个。

在上述类的设计中,先设计的是real,然后是image。在构造函数时,虽然先给出的是image,但是在public里先构造的是real,因此在构造函数中应先执行real。  

2.析构函数

在C++中,析构函数(Destructor)是一种特殊的成员函数,用于在对象生命周期结束时执行清理和资源释放操作。析构函数的主要目的是回收对象所占用的资源,例如释放动态分配的内存、关闭文件等。

析构函数的声明和定义如下:

class MyClass {
public:
    // 析构函数
    ~MyClass() {
        // 在这里进行资源释放和清理操作
    }
    
    // 其他成员函数和成员变量的声明
};

析构函数的名称与类名相同,前面带有波浪线(~。它没有参数,也没有返回类型。在析构函数内部,你可以编写所需的清理代码,如释放内存、关闭文件等。析构函数在对象生命周期结束时自动被调用,你不需要手动调用它。

以下是一个使用析构函数的示例,用于释放动态分配的内存:

#include <iostream>

class MyClass {
public:
    int* data;

    // 构造函数
    MyClass(int size) {
        data = new int[size];
        std::cout << "构造函数被调用!" << std::endl;
    }

    // 析构函数
    ~MyClass() {
        delete[] data;
        std::cout << "析构函数被调用!" << std::endl;
    }
};

int main() {
    MyClass obj(5); // 创建对象

    // 执行其他操作...

    return 0;
}

在这个示例中,构造函数用于动态分配一个大小为5的整型数组,并将其地址存储在data成员变量中。析构函数用于在对象生命周期结束时释放这块内存。当对象obj超出作用域或程序结束时,析构函数会自动被调用,释放内存。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/775836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息安全-1网络信息安全概述

文章目录 一、概述1.1 网络安全现状 二、 网络信息安全现状与问题三、网络安全防御3.1 基本属性3.2 安全目标和功能 四、基本技术4.1 基本技术4.2 管理内容&方法4.2.3 管理要素&#xff1a; 五、信息安全管理流程六、法律法规 对网络安全和信息化工作作出重要指示 昨天突然…

OOM--除堆栈溢出外,其他几种溢出

从实践经验的角度出发&#xff0c;在处理小内存或者32位的应用问题时&#xff0c;除了Jaya堆和方法区之外&#xff0c;我们注意到下面这些区域还会占用较多的内存&#xff0c;这里所有的内存总和受到操作系统进程最大内存的限制: 直接内存:可通过-XX:MaxDirectMemorySize调整大…

CS 144 Lab Zero -- 可靠的内存字节流

CS 144 Lab Zero -- 可靠的内存字节流 环境搭建使用socket写一个网络程序In-memory reliable byte stream 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab 0 对应的PDF: Lab Checkpoint 0: networking warmup Lab 0 会省去Telnet部分内容。 环境搭建 Run Ubuntu ver…

模拟算法leetcode刷题

1)替换所有的问号: 1)模拟算法流程&#xff0c;一定要在草稿纸上过一遍流程 2)将流程转化成代码 1576. 替换所有的问号 - 力扣&#xff08;Leetcode&#xff09; class Solution {public String modifyString(String s) {char[] arrays.toCharArray();for(int i0;i<array.le…

去掉回车和换行符

1.工具用notePad 把Linux 等环境下的日志打印出来的sql 复制出来时包含换行符和回车符&#xff0c;无法直接在数据库客户端工具直接执行&#xff0c;需要去掉换行符和回车符。使用notepad 中的替换功能批量替换回车符和换行符。

6. 测试的分类以及黑盒测试、白盒测试和黑盒测试的区别

目录 1. 按照测试对象划分 1.1 界面测试 1.2 可靠性测试 1.3 容错性测试 1.5 兼容性测试 1.6 易用性测试 1.7 安装卸载测试 1.8 安全性测试 1.9 性能测试 1.10 内存泄漏测试 2. 按是否查看代码划分 2.1 黑盒测试&#xff08;Black-box Testing&#xff09; 优点 …

在 IDEA 中使用 Git 图文教程

Git 专栏索引&#xff1a; Git 分布式版本控制系统使用教程 在 IDEA 中使用 Git 图文教程 在 IDEA 中使用 Git 图文教程 &#x1f680;1. 配置 Git&#x1f680;2. 创建项目远程仓库&#x1f680;3. 初始化本地仓库&#x1f680;4. 连接远程仓库&#x1f680;5. 提交到本地仓库…

Python(二十三)运算符——赋值运算符

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

CityGML三维场景查看

今天我将展示如何读取 CityGML 文件并以 3D 方式查看其信息&#xff0c;以及如何通过挤出将shapefile转化为3D模型。 我还没有找到 3D 渲染器中可用设置的非常详细的描述&#xff0c;因此我花了一些时间测试它们。 我试图弄清楚它们的作用以及何时使用它们。 我将在本文末尾解…

英码积极参与行业交流活动,“快、易、省”赋能更多企业具备AI能力

2023年&#xff0c;ChatGPT的火爆引发了算力需求的大爆发&#xff0c;有人说&#xff0c;边缘计算因兼具时延低与安全等优势&#xff0c;或将成为解决AI算力紧张的良方&#xff1b;在人工智能产业发展的推动下&#xff0c;边缘计算成为了众人瞩目的焦点。随着应用场景的多元化和…

关于 华为云:服务器上传文件夹后显示403

问题原因&#xff1a; 华为云&#xff1a;当前使用的操作系统默认的umask 值是0027 上传文件后出现权限403 的问题&#xff1a; 解决1&#xff1a;修改 /etc/profile 文件 027 022 查看是否修改&#xff1a; 指令&#xff1a;umask 0022 需要删除之前的 文件重新上传&am…

【C语言】指针还不会?这一篇就够了

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

HNU-计算机系统CS-学习感悟

本学期学的两门核心课&#xff0c;一个CS&#xff0c;一个OS。对我来说都有一定难度。 CS总评91/100。主要是期末考试没太发挥好&#xff0c; 主要原因是存储部分有个没有考虑写的情况&#xff0c;送了8分。 总领 CS的学习采用最经典的书——CSAPP&#xff0c;也被称为计算机…

vue3 ts vite electron开发桌面程序

1、搭建vuetsvite项目 # 创建Vue项目 npm init vue # 安装依赖 npm install # 一定要安装成开发依赖 npm install electron electron-builder -D 根目录创建plugins文件夹&#xff0c;文件夹中创建ts文件&#xff0c;vite.electron.build.ts是打包文件代码&#xff0c;v…

LeetCode面试题02.07.链表相交

面试题02.07.链表相交 两种解题思路 面试题02.07.链表相交一、双指针二、哈希集合 一、双指针 这道题简单来说&#xff0c;就是求两个链表交点节点的指针 这里注意&#xff1a;交点不是数值相等&#xff0c;而是指针相等 为了方便举例&#xff0c;假设节点元素数值相等&…

MySQL 坐标批量计算及优化

文章目录 1、坐标计算2、优化 现在有一个需求&#xff0c;就是找出距离某用户最近的一些点&#xff0c;一种实现方法就是调用地图的api来计算筛选&#xff0c;另外一种就是在数据库中计算&#xff0c;考虑到地图api有并发量限制&#xff0c;所以选用数据库计算的方式。 1、坐标…

Python实现HBA混合蝙蝠智能算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

成功升级scikit-image的版本,从老版本0.13.0到0.17.2

成功升级scikit-image的版本&#xff0c;从老版本0.13.0到0.17.2 之前参考其他博客升级scikit-image的版本没有成功&#xff0c;这次参考scikit-image的github官网&#xff0c;顺利实现了升级。 scikit-image的github官网中关于安装的介绍页 https://github.com/scikit-imag…

Dubbo入门实战最全攻略(基于 Spring Boot 实现)

Dubbo应用 RPC通信 Apache Dubbo 3构建在 HTTP/2 协议之上&#xff0c;具有更好的穿透性与通用性 &#xff0c; 支持基于 IDL 的服务定义 集成了业界主流的大部分协议&#xff0c;使得用户可以在 Dubbo 框架范围内使用这些通信协议 &#xff0c; 这些协议包括 rest、hessian…

【动态规划】三步问题

&#x1f9c1;题目描述&#xff1a; 示例&#xff1a; &#x1f9c0;(1)题目解析&#xff1a; 小孩每一次可以走1,2,3步&#xff0c;那么形成不同的排列组合&#xff0c;会有很多种上楼梯方式。 &#x1f9c0;(2)算法原理&#xff1a; &#x1f951;[1]状态表示 根据题目要…