C++(5) 构造函数、析构函数和封装案例

文章目录

      • 构造函数、析构函数和封装案例
        • 1. 构造函数和析构函数
          • 1.1 概述
          • 1.2 案例
          • 1.3 编译器自行提供构造函数
          • 1.4 拷贝构造函数和特殊用法
          • 1.5 构造函数总结和要求
        • 2. 封装案例
          • 2.1 封装的终极奥义
          • 2.2 封装一个 Cube 立方体

构造函数、析构函数和封装案例

1. 构造函数和析构函数
1.1 概述

构造函数用途

  • 首先配合 new 关键字使用
  • new 关键字根据构造函数名称对应的数据类型,在内存【堆区】申请必要的内存空间
  • 构造函数将对应的内存空间进行初始化赋值操作

格式和要求

  • 构造函数名称必须是【类名】
  • 构造函数没有返回值类型,也不需要使用 void 或者 void * 占位
  • 初始化操作列表根据当前实际所需完成
类名(必要的初始化参数列表)
{初始化语句;
}
1.2 案例
#include <iostream>#include <cstdio>
#include <cstdlib>
#include <cstring>using namespace std;class Person
{
public:/*当前函数就是一个构造函数,函数名对应当前的类名,函数的形式参数列表为空【无参数的构造函数】*/Person(){// id 和 age 初始化id = 0;age = 0;// 构造函数,对 name 成员变量使用操作所需的内存空间进行申请和擦除name = (char *)malloc(32);memset(name, 0, 32);// name = "James";}// 有参数构造函数给予变量进行赋值操作Person(int id, char *name, int age){this->id = id;this->age = age;this->name = (char *)malloc(32);memset(this->name, 0, 32);strcpy(this->name, name);}// 【拷贝构造函数】将参数 Person 对象数据内容,完整的拷贝一份给予当前实例化// Person 对象。当前参数是一个 Person & ,可以认为是用于初始化当前对象的数据载体// 将参数 Person 中的成员变量数据,赋值给新实例化对象Person(const Person & person){// 将参数 person 中的数据内容,赋值给当前的新对象中id = person.id;age = person.age;name = (char *)calloc(1, 32);strcpy(name, person.name);}~Person(){// delete 关键字销毁当前 new 创建的对象,会自动调用析构函数// 可以在析构函数中,释放成员变量或者其他操作申请的空间或资源// name 成员变量的数据内容时通过 malloc 申请的,需要通过 free 释放// 避免内存泄漏free(name);}void setId(int id) { this->id = id; }int getId() { return id; }void setName(char *name) { strcpy(this->name, name);}char * getName() { return name; }void setAge(int age) { this->age = age; }int getAge() { return age; }private:int id;char *name;int age;
};int main(int argc, char const *argv[])
{/*new Person; 没有明确任何参数,对应无参数构造参数new Person; // <==> new Person();*/Person *p = new Person;cout << "ID : " << p->getId() << endl;cout << "Name : " << p->getName() << endl;cout << "Age : " << p->getAge() << endl;cout << "----------------------------------" << endl;/*利用实际参数,告知编译器,当前选择的构造函数时有参构造函数这里利用得时函数的【重载】*/Person *p1 = new Person(3, "Wade", 32);cout << "ID : " << p1->getId() << endl;cout << "Name : " << p1->getName() << endl;cout << "Age : " << p1->getAge() << endl;cout << "---------------------------------" << endl;Person *p2 = new Person(*p1);cout << "p1 : " << p1 << endl;cout << "p2 : " << p2 << endl;cout << "ID : " << p2->getId() << endl;cout << "Name : " << p2->getName() << endl;cout << "Age : " << p2->getAge() << endl;/*class 类型,通过 delete 释放 new 申请的空间,会自动调用当前类中的析构函数 ~Person()delete 本是就是用于释放通过 new 申请的内存空间同时可以在析构函数中,释放/关闭其他必要的资源*/delete p;delete p1;delete p2;return 0;
}
1.3 编译器自行提供构造函数
#include <iostream>using namespace std;/*
一个类没有【显式】定义构造函数,系统会自动给提供两个构造函数和默认析构函数1. 无参数构造函数【注意】如果代码中存在任何一个【显式】定义的构造函数,编译器不再提供默认无参数构造函数2. 拷贝构造函数:根据当前类中的成员变量数据情况,进行成员变量逐一拷贝赋值3. 默认析构函数*/
class Person
{
public:int id;string name;int age;// Person(int id) { this->id = id; }
};int main(int argc, char const *argv[])
{// 调用系统的无参数构造函数Person *p = new Person();p->id = 10;p->name = "Mary";p->age = 13;// 调用系统提供的默认拷贝构造函数Person *p1 = new Person(*p);cout << "ID : " << p1->id << endl;cout << "Name : " << p1->name << endl;cout << "Age : " << p1->age << endl;delete p;delete p1;return 0;
}
1.4 拷贝构造函数和特殊用法

同类型变量赋值操作,会调用拷贝函数完成对应代码

#include <iostream>using namespace std;class Person
{
public:int id;string name;int age;Person() {}Person(int id, string name, int age){this->id = id;this->name = name;this->age = age;}// Person(int id) { this->id = id; }Person(const Person &person){id = person.id;name = person.name;age = person.age;cout << "拷贝构造函数执行" << endl;}
};int main(int argc, char const *argv[])
{Person p;p.id = 1;p.name = "张三";p.age = 17;/*发现代码中调用拷贝构造函数执行这里存在类重载 = 赋值号运算符的效果,将 p 数据赋值给 p1c++ 会自动调用拷贝构造函数,将 p 中的数据通过拷贝构造赋值给 p1 中的数据内容*/Person p1 = p;cout << "ID : " << p1.id << endl;cout << "Name : " << p1.name << endl;cout << "Age : " << p1.age << endl;// 不同的地址cout << "p1 : " << &p1 << endl;cout << "p : " << &p << endl;return 0;
}
1.5 构造函数总结和要求
  • 任何一个定义类,必须提供无参数构造函数
  • 利用析构函数逻辑,一定要对当前对象使用的其他内存空间,或者必要的资源进行释放操作。
  • 拷贝构造函数是将参数对象的数据内容,赋值给当前对象,如果是在使用 = 赋值运算符,也会调用拷贝构造函数
2. 封装案例
2.1 封装的终极奥义
  • 一个代码如果使用三次以上,封装一个函数
  • 一组函数使用三次以上,封装一个工具
  • 一个工具开发中使用了三次以上,完成对应的完备的文档
2.2 封装一个 Cube 立方体
#include <iostream>using namespace std;class Cube
{
public:// 构造函数Cube() {}Cube(int length, int width, int height){this->length = length;this->width = width;this->height = height;}Cube(const Cube & cube): length(cube.length), width(cube.width), height(cube.height) {}~Cube() {}// 设置成员变量和成员变量数据相关函数void setLength(int length) { this->length = length; }int getLength() { return length; }void setWidth(int width) { this->width = width; }int getWidth() { return width; }void setHeight(int height) { this->height = height; }int getHeight() { return height; }// 体积获取int getVolume(){return length * width * height;}// 面积获取int getArea(){return 2 * (length * width + length * height + width * height);}private:// 成员变量全部私有化,需要提供对应的 set 和 get 函数完成成员变量赋值和取值操作int length;int width;int height;
};int main(int argc, char const *argv[])
{Cube * c1 = new Cube(10, 10, 10);cout << "Volume : " << c1->getVolume() << endl; // 1000cout << "Area : " << c1->getArea() << endl; // 600return 0;
}

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

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

相关文章

[01 LinuxShell ] 清华大学电子系科协软件部2023暑期培训

清华大学电子系科协软件部2023暑期培训_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11N4y187ZE/?spm_id_from333.1007.top_right_bar_window_custom_collection.content.click&vd_source3ef6540f8473c7367625a53b7b77fd66 本视频为清华大学电子系科协软件部2023…

简单介绍----微服务和Spring Cloud

微服务和SpringCloud 1.什么是微服务&#xff1f; 微服务是将一个大型的、单一的应用程序拆分成多个小型服务&#xff0c;每个服务负责实现特定的业务功能&#xff0c;并且可以通过网络通信与其他服务通信。微服务的优点是开发更灵活&#xff08;不同的微服务可以使用不同的开…

nginx使用stream模块代理端口

今天原本准备将本地金仓的54321端口进行代理的&#xff0c;但是发现代理后总是无法访问。后来突然发现之前使用nginx代理的是一个地址而不是端口。因此做以下笔记用来做记录。 一、stream安装与配置 假设nginx在usr/local/nginx中 1. 测试当前nginx是否有stream模块 ./usr/…

FPGA 通过 UDP 以太网传输 JPEG 压缩图片

FPGA 通过 UDP 以太网传输 JPEG 压缩图片 简介 在 FPGA 上实现了 JPEG 压缩和 UDP 以太网传输。从摄像机的输入中获取单个灰度帧&#xff0c;使用 JPEG 标准对其进行压缩&#xff0c;然后通过UDP以太网将其传输到另一个设备&#xff08;例如计算机&#xff09;&#xff0c;所有…

代码随想录算法刷题训练营day17

代码随想录算法刷题训练营day17&#xff1a;LeetCode(110)平衡二叉树 LeetCode(110)平衡二叉树 题目 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(…

计算机二级C语言的注意事项及相应真题-6-程序填空

目录 51.将参数num按升序插入到数组xx中52.在数组中找出两科成绩之和最高的学生并返回其在数组中的下标53.删除所有串长超过k的字符串&#xff0c;输出剩下的字符串54.根据所给的一组学生的成绩&#xff0c;计算出平均成绩&#xff0c;并计算低于平均成绩的学生的平均成绩55.将…

python连接activemq

安装使用到的库 输入如下命令安装stomp pip install stomp.py 发送请求 # -*-coding:utf-8-*-import stomp import time# 队列名(接收方可以根据管道名来选择接受那个队列数据) location_queue "123456" # 服务器ip,端口固定用这个 conn stomp.Connection([(127…

AlexNet,ZFNet详解

1 AlexNet 网络结构 对于AlexNet网络来说&#xff0c;因为当时资源环境受限&#xff0c;他从第一步卷积开始就把一个图像分到两个GPU上训练&#xff0c;然后中间进行组合最后进行融合成全连接成1000个置信度 1 得到一张3x224x224的图像&#xff0c;然后进行11x11的卷积&…

山海鲸智慧医疗解决方案:让医疗数据说话

在医疗领域&#xff0c;数据可视化对于提高诊疗效率、辅助医学研究和提升患者就医体验具有重要意义。作为山海鲸可视化软件的开发者&#xff0c;我们致力于利用先进的数据可视化技术&#xff0c;为医疗行业提供高效、智能的解决方案&#xff0c;本篇文章就带大家一起了解一下这…

03 创建图像窗口的几种方式

read_image(Image, printer_chip/printer_chip_01) * 打开图像窗口 *用来打开一个新的图形窗口&#xff0c;可以用来显示图标对象&#xff0c;如图像、区域和线条&#xff0c;也可以执行文本输出。 *该窗口自动变为活动状态&#xff0c;所有所有输出(dev_display和自动显示操作…

pdf 转html 在线预览和查询

方案一&#xff1a;pdf2htmlex package com.realize.controller;import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSONObject; import com.realize.util.MsgUtil; import com.realize.util.OssUtil; import com.realize.util.PdfConvertUtil; import com.reali…

java大数据hadoop2.9.2 hive操作

1、创建常规数据库表 &#xff08;1&#xff09;创建表 create table t_stu2(id int,name string,hobby map<string,string> ) row format delimited fields terminated by , collection items terminated by - map keys terminated by :; &#xff08;2&#xff09;创…

【Linux】开始使用 vim 吧!!!

Linux 1 what is vim &#xff1f;2 vim基本概念3 vim的基本操作 &#xff01;3.1 vim的快捷方式3.1.1 复制与粘贴3.1.2 撤销与剪切3.1.3 字符操作 3.2 vim的光标操作3.3 vim的文件操作 总结Thanks♪(&#xff65;ω&#xff65;)&#xff89;感谢阅读下一篇文章见&#xff01;…

Power ModeII 插件的下载与使用-----idea

下载 Marketplace里面搜索下载即可 使用 下载后重启软件就可以用了 下面是一些关于Power ModeII &#xff0c;我的个性化设置截图 以及相关设置解释 插件或扩展的设置面板【用于给代码编辑器或集成开发环境&#xff08;IDE&#xff09;添加视觉效果】 主要设置 ENTER POWE…

力扣0092——反转链表II

反转链表II 难度&#xff1a;中等 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例1 输入&#xff1a; head [1,2,3,4,5], left 2,…

数学知识第三期 欧拉函数

前言 相信大家在高中的时候接触过欧拉函数&#xff0c;希望大家通过本篇文章能够进一步理解欧拉函数&#xff01;&#xff01;&#xff01; 一、什么是欧拉函数&#xff1f; 欧拉函数是一个在数论中用于描述特定正整数的互质数的概念。具体来说&#xff0c;对于一个正整数n&…

vue项目前端生成EXCEL模板并解析上传JSON

一&#xff0c;安装依赖 并引入 "file-saver": "^2.0.5", "xlsx": "^0.18.5" import { saveAs } from "file-saver"; 二&#xff0c;生成模板 button_23Click() {const self this;// 导入模板下载// const tableDa…

每日一题 力扣2861 最大合金数

2861. 最大合金数 题目描述&#xff1a; 假设你是一家合金制造公司的老板&#xff0c;你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用&#xff0c;并且你可以使用 k 台机器来制造合金。每台机器都需要特定数量的每种金属来创建合金。 对于第 i 台机器…

华为机考入门python3--(0)模拟题3-计算字符串重新排列数

分类&#xff1a;排列组合 知识点&#xff1a; 计算字符串中每个字符出现的次数 Counter(string) 计算列表中每个元素出现的次数 Counter(list) 阶乘 math.factorial(num) 排列去重 题目来自【华为招聘模拟考试】 先把每个字符当成唯一出现过一次&#xff0c;计算所有排列…

keepalived+nginx双主热备(有问题私信)

keepalivednginx双主热备 前言keepalivednginx双主热备keepalivednginx双主热备部署安装nginx安装keepalived修改master节点的keepalived配置文件 修改backup节点的keeepalived配置文件配置keepalived主备配置keepalived双主热备 前言 有关keepalived和nginx的一些工作原理&am…