济南住房和城乡建设局网站seo网站导航建设技巧

news/2025/10/7 10:15:06/文章来源:
济南住房和城乡建设局网站,seo网站导航建设技巧,如何注册公司名称,建设培训中心网站目录 一、前言 二、为什么会出现构造函数和析构函数 三、构造函数 #x1f34e;构造函数的概念 #x1f350;构造函数特性 #x1f4a6;解释特性3#xff1a;对象实例化时编译器自动调用对应的构造函数 #x1f4a6;解释特性4#xff1a;构造函数支持重载 …目录 一、前言 二、为什么会出现构造函数和析构函数  三、构造函数 构造函数的概念  构造函数特性  解释特性3对象实例化时编译器自动调用对应的构造函数 解释特性4构造函数支持重载 解释特性5如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成 解释特性6无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个 四、析构函数  析构函数概念  析构函数特性  五、共勉 一、前言 在我们前面学习的类中我们会定义成员变量和成员函数这些我们自己定义的函数都是普通的成员函数但是如若我们定义的类里什么也没有呢是真的里面啥也没吗如下 class Date {}; 如果一个类中什么成员都没有简称为空类。空类中什么都没有吗并不是的任何一个类在我们不写的情况下都会自动生成6个默认成员函数。 【默认成员函数概念】用户没有显式实现编译器会生成的成员函数称为默认成员函数           其中两个默认成员函数是用来初始化和清理的分别为构造函数、析构函数      ⭐ 本次博客将详解为什么会出现这两个函数这两个函数将如何使用 的问题⭐ 二、为什么会出现构造函数和析构函数  首先看下面这段 C语言代码 typedef struct Date {int year;int month;int day; }D;void Init(D* date) {date-year 2023;date-month 10;date-day 21; } void Printf(D* date) {cout date-year - date-month - date-day endl endl; } void Destory(D* date) {date-year 0;date-month 0;date-day 0; } int main() {D date;Init(date);Printf(date);Destory(date);return 0; }   ⚠ 注意大家在日常写代码和刷题的时候肯定会有过忘记初始化或者忘记销毁这些小细节很容易被大家忽略但是出现在代码中就会出现报错导致我们写代码的时候就很烦。 ⚠ 忘记写初始化输出随机值结果会错误   ⚠ 忘记写销毁时间久了便会造成【内存泄漏】   你是否发现若是我们要去使用一个Date的话通常不会忘了去往里面入数据或者是出数据但是却时常会忘了【初始化】和【销毁】。这要如何是好呢   解决方案 1️⃣在上一文的学习中我们学习到了一个类中的一个东西叫做this指针只要是在成员函数内部都可以进行调用。而且还知晓了C中原来是使用this指针接受调用对象地址的机制来减少对象地址的传入减轻了调用者的工作。这也是C区别于C很大的一点 2️⃣那C中是否还有东西能够替代【初始化】和【销毁】这两个工作呢答案是有的就是我们接下来要学习的【构造函数】和【析构函数】   三、构造函数 构造函数的概念  如下的日期类 class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout 今日日期输出 endl;cout _year - _month - _day endl;} private:int _year;int _month;int _day; }; int main() {Date d1;d1.Init(2023, 10, 21);d1.Print();return 0; } 运行效果         正常情况下我们写的这个日期类首先初始化其次打印。但如果说你突然忘记初始化了直接就开始访问会怎么样呢         从运行结果上看没初始化直接访问输出的是随机值。 忘记初始化其实是一件很正常的事情C大佬在这一方面为了填补C语言的坑必须得手动初始化。因而就设计出了构造函数。         构造函数是一个特殊的成员函数名字与类名相同,创建类类型对象时由编译器自动调用保证每个数据成员都有 一个合适的初始值并且在对象的生命周期内只调用一次。其目的就是为了方便我们不需要再初始化。 构造函数特性  构造函数是特殊的成员函数需要注意的是构造函数的虽然名称叫构造但是需要注意的是构造函数的主要任务并不是开空间创建对象而是初始化对象。 其特征如下 函数名和类名相同无返回值对象实例化时编译器自动调用对应的构造函数构造函数可以重载如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个。注意无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数都可以认为是默认成员函数。 如下即为构造函数 Date() {_year 1;_month 1;_day 1; } 解释特性3对象实例化时编译器自动调用对应的构造函数 也就是说我们在实例化一个对象后它会自动调用这个构造函数自动就初始化了我们可以通过调试看看   解释特性4构造函数支持重载 如下的函数 Date(int year, int month, int day) {_year year;_month month;_day day; }         像这个重载函数是明确了我们要传参的所以我们在实例化对象后就必须把参数写上去虽然看着奇奇怪怪但是没有办法毕竟我们普通的调用参数都是在函数名后面而这个参数在实例化对象后面 Date d2(2023, 10, 21); 来输出和我们先前的构造函数对比看看 注意没有参数时我在调用的时候不能加上括号切忌构造函数尤为特殊如果通过无参构造函数创建对象时对象后面不用跟括号否则就成了函数声明 无参的情况下必须要像我们刚开始实例化的d1那样 Date d1; d1.Print();  构造函数的重载我们推荐写成全缺省的样子 //普通的构造函数Date(){_year 1;_month 1;_day 1;} //全缺省的构造函数Date(int year 1, int month 1, int day 1){_year year;_month month;_day day;}         首先普通的构造函数和全缺省的构造函数在不调用的情况下可以同时存在编译也没有错误。但是在实际调用的过程中会存在歧义。如下的调用 class Date { public: //普通的构造函数Date(){_year 1;_month 1;_day 1;} //全缺省的构造函数Date(int year 1, int month 1, int day 1){_year year;_month month;_day day;}void Print(){cout _year - _month - _day endl;} private:int _year;int _month;int _day; }; int main() {Date d1;d1.Print(); }         此时我实例化的d1到底是调用普通的构造函数还是调用全缺省的构造函数并且此段代码编译出现错误。何况我在没有调用函数的情况下编译是没错的。         由此可见它们俩在语法上可以同时存在但是使用上不能同时存在因为会存在调用的歧义不知道调用的是谁所以一般情况下我们更推荐直接写个全缺省版的构造函数因为是否传参数可由你决定。传参数数量也是由你决定。 解释特性5如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成 看如下代码自己不去写构造函数使用编译器默认的构造函数 class Date { public:// 我们不写编译器会生成一个默认无参构造函数/*Date(int year 1, int month 1, int day 1){_year year;_month month;_day day;}*/void Print(){cout _year - _month - _day endl;} private:int _year;int _month;int _day; }; int main() {// 没有定义构造函数对象也可以创建成功因此此处调用的是编译器生成的默认构造函数Date d;d.Print(); }         不是说好我不自己写构造函数编译器会默认生成吗为什么到这又是随机值了这难道也算初始化别急搞清楚这个得先明白默认构造函数⚠ 默认构造函数 1. 我们不写编译器默认生成的那个构造函数叫默认构造2. 无参构造函数也可以叫默认函数3. 全缺省也可以叫默认构造       总结 可以不传参数就调用构造都可以叫默认构造⚠ C把变量分成两种       1️⃣内置类型/基本类型int、char、double、指针……      2️⃣自定义类型class、struct去定义的类型对象         C默认生成的构造函数对于内置类型成员变量不做处理对于自定义类型的成员变量才会处理这也就能很好的说明了为什么刚才没有对年月日进行处理初始化因为它们是内置类型int类型的变量 让我们来看看自定义类型是如何处理的。 class A { public:A(){cout A() endl;_a 1;} private:int _a; };         首先这是一个名为A的类有成员变量_a并且还有一个无参的构造函数对_a初始化为1。接着 class Date { public:void Print(){cout _year - _month - _day endl;cout endl;} private:int _year 2023;int _month 11;int _day 11;A _aa; };int main() {Date d1;d1.Print();return 0; }        通过运行结果以及调试也正验证了默认构造函数对自定义类型才会处理。这也就告诉我们当出现内置类型时就需要我们自己写构造函数了。 什么时候使用默认构造函数会凸显出其价值呢就比如我们之前写的括号匹配这道题 class Stack { public:Stack(){_a nullptr;_top _capacity;} private:int* _a;int _top;int _capacity;};class MyQueue { public://默认生成的构造函数就可以用了void push(int x){}int pop() {} private:Stack _S1;Stack _s2; };         此时我队列里自定义类型_s1和_s2就不需要单独写初始化了直接用默认的。但是如果栈里没有写构造函数那么其输出的还是随机的因为栈里的也是内置类型。就是一层套一层下一层生效的前提是上一层地基打稳了。总结 如果一个类中的成员全是自定义类型我们就可以用默认生成的函数如果有内置类型的成员或者需要显示传参初始化那么都要自己实现构造函数。 解释特性6无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个 默认构造函数 1. 我们不写编译器默认生成的那个构造函数叫默认构造2. 无参构造函数也可以叫默认函数3. 全缺省也可以叫默认构造 总结 可以不传参数就调用构造都可以叫默认构造既然我默认构造函数只对自定义类型才会处理那如果我不想自己再写构造函数也要对内置类型处理呢我们可以这样做 class Date { public:// 我们不写编译器会生成一个默认无参构造函数/*Date(int year 1, int month 1, int day 1){_year year;_month month;_day day;}*/void Print(){cout _year - _month - _day endl;} private:// C11 打的补丁针对编译器自己默认成员函数不初始化问题int _year 2023;int _month 10;int _day 21; }; int main() {// 没有定义构造函数对象也可以创建成功因此此处调用的是编译器生成的默认构造函数Date d;d.Print(); } 总结 构造函数是类中默认就带有的不过日常自己在写一个类的时候尽量不要用默认生成的最好是自己写一个无参或者是缺省的都可以但是不可以无参和全缺省共存会引发歧义。若是使用默认生成的构造函数会引发一些语言本身就带有的缺陷【内置类型】的数据不会被初始化还会是一个随机值【自定义类型】的数据会调用默认构造函数默认生成、无参、全缺省若是不想看到随机值的话可以参照C11中的特性在内置类型声明的时候就为其设置一个初始化值便不会造成随机值的问题 四、析构函数  析构函数概念  前面通过构造函数的学习我们知道一个对象时怎么来的那一个对象又是怎么没呢的         析构函数与构造函数功能相反析构函数不是完成对象的销毁局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数完成类的一些资源清理工作。   析构函数特性  析构函数是特殊的成员函数。 其特征如下 析构函数名是在类名前加上字符 ~。无参数无返回值。一个类有且只有一个析构函数。若未显式定义系统会自动生成默认的析构函数。对象生命周期结束时C编译系统系统自动调用析构函数编译器生成的默认析构函数对会自定类型成员调用它的析构函数 我们实际写一个析构函数看看 ~Date() {cout ~Date() endl; } 带入示例再看看 class Date { public:Date(int year 2023, int month 10, int day 21){_year year;_month month;_day day;}void Print(){cout _year - _month - _day endl;}~Date(){cout ~Date() endl;} private:int _year;int _month;int _day; }; int main() {Date d1;d1.Print();return 0; }         首先我实例化出的d1会调用它的默认构造函数进行初始化其次出了作用域后又调用其析构函数这也就是为什么输出结果会是~Date()         析构的目的是为了完成资源清理什么样的才能算是资源清理呢像我这里定义的年月日变量就不需要资源清理因为出了函数栈帧就销毁真正需要清理的是malloc、new、fopen这些的就比如清理栈里malloc出的 class Stack { public://构造函数Stack(int capacity 10){_a (int*)malloc(sizeof(int) * capacity);assert(_a);_top 0;_capacity capacity;}//析构函数~Stack(){free(_a);_a nullptr;_top _capacity 0;} private:int* _a;int _top;int _capacity; }; int main() {Stack st; } 这里不难感慨C的构造函数就像先前C语言常写的Init而析构函数就像Destroy 看如下的题目现在我用类实例化出st1和st2两个对象首先st1肯定先构造st2肯定后构造这点毋庸置疑那关键是谁先析构呢 int main() {Stack st1;Stack st2; } 答案st2先析构st1后析构 解析这里st1和st2是在栈上的建立栈帧其性质和之前一样后进先出st2后压栈那么它肯定是最先析构的。所以栈里面定义对象析构顺序和构造顺序是反的。         若自己没有定义析构函数虽说系统会自动生成默认析构函数不过也是有要求的和构造函数一样内置类型不处理自定义类型会去调用它的析构函数如下 class Stack { public://构造函数Stack(int capacity 10){_a (int*)malloc(sizeof(int) * capacity);assert(_a);_top 0;_capacity capacity;}//析构函数~Stack(){cout ~Stack(): this endl;free(_a);_a nullptr;_top _capacity 0;} private:int* _a;int _top;int _capacity;}; class MyQueue { public://默认生成的构造函数可以用//默认生成的析构函数也可以用void push(int x){}int pop(){} private:Stack _S1;Stack _s2; }; int main() {MyQueue q; }         对于MyQueue而言我们不需要写它的默认构造函数因为编译器对于自定义类型成员_S1和_S2会去调用它的默认构造Stack提供了默认构造出了作用域编译器会针对自定义类型的成员去默认调用它的析构函数因为有两个自定义成员_S1和_S2自然析构函数也调了两次所以会输出两次Stack()……   总结 如果类中没有申请资源时析构函数可以不写直接使用编译器生成的默认析构函数比如Date类有资源申请时一定要写否则会造成资源泄漏比如Stack类。 五、共勉 以下就是我对C类的默认成员函数--------构造函数析构函数的理解如果有不懂和发现问题的小伙伴请在评论区说出来哦同时我还会继续更新对C 类的默认成员函数-------拷贝构造赋值重载的理解请持续关注我哦

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

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

相关文章

股市技术分析突破

本书通过简洁生动的文字和图文并茂的形式介绍了股市分析的各种理论、技巧和心法。 全书分为4篇共10章。技术篇(第1~5章)重点介绍股票估值和财务报表分析的实用方法,以及技术分析的各种理论及技巧,包括常见的K线组合…

干货分享:无需下载,在线快速编辑图片的完整教程

你有没有遇到过这种情况:临时需要剪个图、去个水印,却发现电脑没装PS,或者软件太卡根本带不动?别担心,现在有不少在线P图工具特别好用,打开网页就能操作,无需安装,上手简单,连新手也能轻松搞定! 一、为什么推…

34.1STM32下的can总线实现知识(区分linux)_csdn - 详解

34.1STM32下的can总线实现知识(区分linux)_csdn - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

js实现promise常用场景使用示例

下面为你介绍 JavaScript 中 Promise 的几个些常用场景及实现示例,这些场景在实际开发中经常会遇到。 1. 异步请求处理 Promise 最常见的用途之一是处理异步请求,比如使用 fetch API 调用后端接口: // 发起 GET 请求…

企业加强网站建设的必要性天津网站优化公司推荐哪家

说明:本系列是七月算法深度学习课程的学习笔记 文章目录1神经网络与卷积神经网络1.1 深度神经网络适合计算机视觉处理吗1.2CNN的结构1.2.1 数据输入层1.2.2 卷积层1.2.3 激励层1.2.3 池化层1.2.4 全连接层1.3CNN的训练算法1.4CNN的优缺点2正则化与Droupout3典型结构…

spatial for parallel compute 使用简介

spatial for parallel compute 使用简介spatial 能干嘛 spatial 可以很方便地设计并行计算电路,内置了 并行计算语法和流水线语法支持。 下载与编译 官方下载地址是 https://github.com/stanford-ppl/spatial 国内的备…

网站icp备案信息成都旅游的网站建设

一、简介 本文介绍基于 buildroot 文件系统的 QT 模块的使用方法: • 如何在 buildroot 工具里编译 QT 动态库; • 编译及运行 qt_demo 应用程序; • 适配过程遇到的问题。 二、QT动态库编译 在项目根路径执行 ./build.sh buildroot_menuc…

Mermaid 绘图--以企业权限视图为例 - 详解

Mermaid 绘图--以企业权限视图为例 - 详解2025-10-07 10:06 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

英语_阅读_Balancing Benefits and Risks_待读

Digital Life: Balancing Benefits and Risks Digital life has become a huge part of how we learn, play and connect, 数字生活已经成为我们学习、娱乐和社交的重要组成部分, From AI tutors that support school…

网站模版asp北京建网站公司

文章目录 零. RpcService服务概述1. AkkaRpcService的创建和初始化2.通过AkkaRpcService初始化RpcServer3. ResourceManager中RPC服务的启动4. 实现相互通讯能力 零. RpcService服务概述 RpcService负责创建和启动Flink集群环境中RpcEndpoint组件的RpcServer,且Rpc…

手机网站判断跳转淄博周村学校网站建设报价

前言 本文由于介绍Android多线程编程的学习。 线程基本用法 定义线程有两种方式,分别是继承Thread类、实现Runnable接口: 继承Thread类:只需新建一个类继承自Thread,然后重写父类的run()方法,在这个方法里面写耗时…

为什么有些网站看不到百度快照南宁网站制作哪家好

对于做互联网的朋友们来说,引流是一个必不可少的环节。 掌握一种优秀的引流方法至关重要,这也可以视为我们的生计之源。 今天,我将向大家介绍一款全自动的引流工具——抖音全自动引流脚本软件。 这款软件的效果非常显著,它可以替…

怎么做新网站才能被百度收录有哪些官网做得比较好

版本与信息查询 docker --version:查看安装的Docker版本。 docker info:获取Docker系统的详细配置信息。 镜像管理 docker images:列出本地所有镜像。 docker search IMAGE_NAME:搜索Docker Hub上的镜像。 docker pull IMAGE_NAME[:TAG]:从仓库下载指定镜像。 docker rmi …

企业网站维护的要求包括前端自我介绍面试技巧

Python的正则表达式使用 定义使用场景查替换分割 常用的正则表达符号查原字符英文状态的句号点 .反斜杠 \英文的[]英文的()英文的?加号 星号 *英文状态的大括号 {} 案例 定义 正则表达式是指专门用于描述或刻画字符串内在规律的表达式。 使用场景 无法通过切片,…

大模型部署

部署云服务部署 优势:前期成本低,维护简单 劣势:数据不安全,长期使用成本高本地机器部署 优势:数据安全,长期成本低 劣势:初期成本高,维护困难他人部署 1.阿里云白炼 2.百度智能云 3.硅基流动 4.火山引擎OLLAM…

读技术之外:社会联结中的人工智能02劳工

读技术之外:社会联结中的人工智能02劳工1. 劳工 1.1. 入口通道处每隔一定距离都会出现很多考勤钟标志 1.2. 休息间里的考勤钟也起着重要作用—进出房间的所有扫描都会被追踪 1.3. 每个班次间只能休息15分钟,还有无薪…

详细介绍:如何有效删除 iPhone 上的所有内容?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

鼠标图标更改样式

https://zhutix.com/tag/cursors/page/2/?post_order=likeI hope all of us can learn to progress!

做网站的预算表广西桂林天气预报15天查询

一、SpringBoot和SpringCloud简介 1、SpringBoot:是一个快速开发框架,通过用MAVEN依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动SpringMVC),简化XML配置&am…

徐州网站建设价格odoo做网站

目录 Vue.js Ajax(axios) GET 方法 请求方法的别名 并发 请求配置项 响应结