网站开发分包网站开发运营工程师待遇

news/2025/10/4 22:10:09/文章来源:
网站开发分包,网站开发运营工程师待遇,网站wordpress是什么意思,数字广东网络建设公司#x1f525;博客主页#xff1a; 小羊失眠啦. #x1f3a5;系列专栏#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞#x1f44d;收藏⭐评论✍️ 文章目录 一、默认成员函数二、构造函数构造函数的概念及特性 三、析构函数析构函数的特性… 博客主页 小羊失眠啦. 系列专栏《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞收藏⭐评论✍️ 文章目录 一、默认成员函数二、构造函数构造函数的概念及特性 三、析构函数析构函数的特性 四、拷贝构造函数拷贝构造函数的特性 一、默认成员函数 上一章中我们谈到如果一个类中什么成员也没有那么这个类就叫作空类。其实这么说是不太严谨的因为一个类不可能什么都没有。 当我们定义好一个类不做任何处理时编译器会自动生成以下6个默认成员函数 默认成员函数如果用户没有手动实现则编译器会自动生成的成员函数。 构造函数主要完成初始化工作析构函数主要完成清理工作拷贝构造使用一个同类的对象初始化创建一个对象赋值重载把一个对象赋值给另一个对象取地址重载普通对象取地址操作取地址重载constconst对象取地址操作 本章我们将学习四个默认成员函数——构造函数与析构函数——拷贝构造 与赋值重载 二、构造函数 在C语言阶段我们实现栈的数据结构时有一件事很苦恼就是每当创建一个stack对象之前叫作定义一个stack类型的变量后首先得调用它的专属初始化函数StackInit来初始化对象。 typedef int dataOfStackType;typedef struct stack {dataOfStackType* a;int top;int capacity; }stack;void StackInit(stack* ps); //...int main(){stack s;StackInit(s);//...return 0;}这不免让人觉得有点麻烦。在C中构造函数为我们很好的解决了这一问题。 构造函数的概念及特性 构造函数是一个特殊的成员函数。构造函数虽然叫作构造但是其主要作用并不是开辟空间创建对象而是初始化对象。 构造函数之所以特殊是因为相比于其它成员函数它具有如下特性 函数名与类名相同无返回值对象实例化时编译器自动调用对应的构造函数构造函数可以重载 举例 class Date { public://无参的构造函数Date(){};//带参的构造函数Date(int year,int month,int day){_year year;_month month;_day day;}private:int _year;int _month;int _day; };void TestDate() {Date d1;//调用无参构造函数自动调用Date d2(2023, 3, 29);//调用带参构造函数自动调用 }特别注意 创建对象时编译器会自动调用构造函数若是调用无参构造函数则无需在对象后面使用()。否则会产生歧义编译器无法确定你是在声明函数还是在创建对象。 错误示例 //错位示例 Date d3();如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成。 class Date { public://若用户没有显示定义则编译器自动生成。/*Date(int year,int month,int day){_year year;_month month;_day day;}*/private:int _year;int _month;int _day; };默认生成构造函数对内置类型成员不作处理对自定义类型成员会调用它的默认构造函数 C把类型分成内置类型基本类型和自定义类型。内置类型就是语言提供的数据类型如int、char、double…自定义类型就是我们使用class、struct、union等自己定义的类型。 举例 默认构造函数对内置类型 class Date { public://此处不对构造函数做显示定义测试默认构造函数/*Date(){}*/void print(){cout _year - _month - _day endl;}private:int _year;int _month;int _day; }; void TestDate1() {Date d1;d1.print(); }如图所示默认构造函数的确未对内置类型做处理。 默认构造函数对自定义类型 class stack { public://此处对stack构造函数做显示定义stack(){cout stack() endl;_a nullptr;_top _capacity 0;} private:int* _a;int _top;int _capacity; };class queue { public://此处不对queue构造函数做显示定义测试默认构造函数/*queue(){}*/ private://自定义类型成员stack _s; };void TestQueue() {queue q; }如图所示在创建queue对象时默认构造函数对自定义成员_s做了处理调用了它的默认构造函数stack()。 这一波蜜汁操作让很多C使用者感到困惑与不满为什么要针对内置类型和自定义类型做不同的处理呢终于在C11中针对内置类型成员不初始化的缺陷又打了补丁即 内置类型成员变量在类中声明时可以给默认值 举例 class Date { public: //...void print(){cout _year - _month - _day endl;} private://使用默认值int _year 0;int _month 0;int _day 0; }; void TestDate2() {Date d2;d2.print(); } 默认值若不对成员变量做处理则使用默认值。 无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个 举例 class Date { public://无参的默认构造函数//Date()//{//}//全缺省的默认构造函数Date(int year 0, int month 0, int day 0){_year year;_month month;_day day;}void print(){cout _year - _month - _day endl;}private:int _year 0;int _month 0;int _day 0; }; 默认构造函数 无参的构造函数全缺省的构造函数C编译器生成的无参的构造函数 即三种必须要有一种如果没有默认的构造函数写的构造函数不是无参的也不是全缺省的就会报错 三、析构函数 析构函数与构造函数的特性相似但功能有恰好相反。构造函数是用来初始化对象的析构函数是用来销毁对象的。 需要注意的是析构函数并不是对对象本身进行销毁因为局部对象出了作用域会自行销毁由编译器来完成而是在对象销毁时会自动调用析构函数对对象内部的资源做清理例如stack _s中的int* a。 同样有了析构函数我们再也不用担心创建对象或定义变量后由于忘记释放内存而造成内存泄漏了。 举例 class Stack { public:Stack(){//...}void Push(int x){//...}bool Empty(){// ...}int Top(){//...}void Destory(){//...} private:// 成员变量int* _a;int _top;int _capacity; };void TestStack() {Stack s;st.Push(1);st.Push(2);//过去需要手动释放st.Destroy(); }析构函数的特性 析构函数名是在类名前加上字符 ~无参数无返回值一个类只能有一个析构函数。若未显式定义系统会自动生成默认的析构函数析构函数不能重载 举例 class Date { public:Date(){cout Date() endl;}~Date(){cout ~Date() endl;} private:int _year 0;int _month 0;int _day 0; };void TestDate3() {Date d3;//d3生命周期结束时自动调用构造函数 }编译器生成的默认析构函数对自定类型成员调用它的析构函数 举例 class stack { public://此处对stack构造函数做显示定义stack(){cout stack() endl;_a nullptr;_top _capacity 0;}~stack(){cout ~Stack() endl;free(_a);_a nullptr;_top _capacity 0;} private:int* _a;int _top;int _capacity; }; class queue { public://此处不对queue构造函数做显示定义测试默认构造函数/*queue(){}*/ private://自定义类型成员stack _s; };void TestQueue1() {queue q; }这里可能有小伙伴会好奇为什么析构函数不像构造函数那样区分内置类型与自定义类型呢 答案是因为内置类型压根不需要我们担心清理工作在其生命周期结束时会自动销毁。而自定义类型需要担心因为自定义类型里可能含有申请资源例如malloc申请内存须手动释放。 如果类中没有申请资源时析构函数可以不写直接使用编译器生成的默认析构函数比如Date类有资源申请时一定要写否则会造成资源泄漏比如stack类。 四、拷贝构造函数 同样拷贝构造函数也属于6个默认成员函数而且拷贝构造函数是构造函数的一种重载形式。 拷贝构造函数的功能就如同它的名字——拷贝。我们可以用一个已存在的对象来创建一个与已存在对象一模一样的新的对象。 举例 class Date { public://构造函数Date(){cout Date() endl;}//拷贝构造函数Date(const Date d){cout Date() endl;_year d._year;_month d._month;_day d._day;}//析构函数~Date(){cout ~Date() endl;} private:int _year 0;int _month 0;int _day 0; };void TestDate() {Date d1;//调用拷贝构造创建对象Date d2(d1); } 拷贝构造函数的特性 拷贝构造函数作为特殊的成员函数同样也有异于常人的特性 拷贝构造函数是构造函数的重载拷贝构造函数的参数只有一个且必须是类类型对象的引用。若使用传值的方式则编译器会报错因为理论上这会引发无穷递归。 错误示例 class Date { public://错误示例//如果这样写编译器就会直接报错但我们现在假设如果编译器不会检查//这样的程序执行起来会发生什么Date(const Date d){_year d._year;_month d._month;_day d._day;} private:int _year 0;int _month 0;int _day 0; };void TestDate() {Date d1;//调用拷贝构造创建对象Date d2(d1); }当拷贝构造函数的参数采用传值的方式时创建对象d2会调用它的拷贝构造函数d1会作为实参传递给形参d。不巧的是实参传递给形参本身又是一个拷贝会再次调用形参的拷贝构造函数…如此便会引发无穷的递归。 若未显式定义编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝这种拷贝叫做浅拷贝或者值拷贝 举例 class Date { public://构造函数Date(int year 0, int month 0, int day 0){//cout Date() endl;_year year;_month month;_day day;}//未显式定义拷贝构造函数/*Date(const Date d){_year d._year;_month d._month;_day d._day;}*/void print(){cout _year - _month - _day endl;} private:int _year 0;int _month 0;int _day 0; };void TestDate() {Date d1(2023, 3, 31);//调用拷贝构造创建对象Date d2(d1);d2.print(); }有的小伙伴可能会有疑问编译器默认生成的拷贝构造函数貌似可以很好的完成任务那么还需要我们手动来实现吗 答案是当然需要。Date类只是一个较为简单的类且类成员都是内置类型可以不需要。但是当类中含有自定义类型时编译器可就办不了事儿了。 类中如果没有涉及资源申请时拷贝构造函数写不写都可以一旦涉及到资源申请时则拷贝构造函数是一定要写的否则就是浅拷贝 错误示例 class stack { public:stack(int defaultCapacity10){_a (int*)malloc(sizeof(int)*defaultCapacity);if (_a nullptr){perror(malloc fail);exit(-1);}_top 0;_capacity defaultCapacity;}~stack(){cout ~Stack() endl;free(_a);_a nullptr;_top _capacity 0;}void push(int n){_a[_top] n;}void print(){for (int i 0; i _top; i){cout _a[i] ;}cout endl;} private:int* _a;int _top;int _capacity; };void TestStack() {stack s1;s1.push(1);s1.push(2);s1.push(3);s1.push(4);s1.print();stack s2(s1);s2.print();s2.push(5);s2.push(6);s2.push(7);s2.push(8);s2.print(); }如图所示这段程序的运行结果是程序崩溃了且通过观察发现是在第二次析构时出现了错误。其实出现错误的原因是在第二次析构时对野指针进行free了。 一个小tip 多个对象进行析构的顺序如同栈一样先创建的对象后析构后创建的对象先析构。 为什么会出现对野指针进行free呢 原因是对象s1与对象s2中的成员_a指向的是同一块空间。在s2析构完成后这块空间已经被释放此时的s1._a就是野指针。这就是浅拷贝导致的后果。 理解浅拷贝 编译器默认生成的拷贝构造函数是按字节序拷贝的在创建s2对象时仅仅是把s1._a的值赋值给s2._a并没有重新开辟一块与s1._a所指向的空间大小相同内容相同的空间。我们把前者的拷贝方式称为浅拷贝后者称为深拷贝。 当开启监视窗口来观察这一过程我们可以看到s2在进行push时s1的内容也在跟着改变且s1._as2._a 正确的做法 class stack { public:stack(int defaultCapacity10){_a (int*)malloc(sizeof(int)*defaultCapacity);if (_a nullptr){perror(malloc fail);exit(-1);}_top 0;_capacity defaultCapacity;}//用户自己定义拷贝构造函数stack(const stack s){_a (int*)malloc(sizeof(int) * s._capacity);if (_a nullptr){perror(malloc fail);exit(-1);}memcpy(_a, s._a, sizeof(int) * s._capacity);_top s._top;_capacity s._capacity;}~stack(){cout ~Stack() endl;free(_a);_a nullptr;_top _capacity 0;}void push(int n){_a[_top] n;}void print(){for (int i 0; i _top; i){cout _a[i] ;}cout endl;} private:int* _a;int _top;int _capacity; };拷贝构造函数典型调用场景 使用已存在对象创建新对象;函数参数类型为类类型对象;函数返回值类型为类类型对象。 为了提高程序效率一般对象传参时尽量使用引用类型返回时根据实际场景能用引用尽量使用引用。

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

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

相关文章

网站如何交换链接临淄房产信息网123

文章目录 一、区别二、编写loader三、编写plugin参考文献 一、区别 前面两节我们有提到Loader与Plugin对应的概念,先来回顾下 loader 是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终…

『回忆录』返校前夜 230102

经典佳作返校,一件每个周末都会经历的事情。而对于居家学习的我们,成了一个梦。 而这个梦,如今已变成现实。一个再平常不过的周末,我们上着竞赛。可是,中午wsh就把我们所有人叫到教室。 “因为疫情,学校要求你们…

断更

今天很忙,没时间学习

前端学习教程-环境配置

1 安装nvm(下载地址:https://github.com/coreybutler/nvm-windows/releases) 2.查看node和npm版本 3.配置npm registry 4.安装VSCode(https://code.visualstudio.com/) 5.VSCode安装插件:Live Server、Vue - Offic…

详细介绍:一篇文章讲清Prompt、Agent、MCP、Function Calling

详细介绍:一篇文章讲清Prompt、Agent、MCP、Function Callingpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

docker单机部署hadoop 官方镜像3.3.6 过程问题记录 - 教程

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

20251004 qmd 弱化规约(未完成)

弱化规约就是指,对于原问题F,先考虑一个弱化版问题F 如果解决F的复杂度是O(n),那么F一定不会优于F 通常的,如果一个算法G能解决F和F,但是一个能解决F的算法不能解决F,那么F比F要弱。 一般弱化问题不能丢掉关键的…

深入解析:人工智能专业术语详解(C)

深入解析:人工智能专业术语详解(C)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

徐州做公司网站多少钱wordpress 评论优化

上期已经信息收集阶段已经完成,接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/(数据库的管理界面) root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

怎么建设投票网站平面设计提高审美网站

当谈论MobileNet、MobileNetV2和MobileNetV3时,我们指的是一系列基于深度学习的轻量级神经网络架构,这些架构旨在在保持高度准确性的同时减少模型的计算和参数量。以下是它们各自的创新点的详细总结: MobileNet: 深度可分离卷积&…

网站后台界面 园林设计网站负责人照片

如果你想通过 RabbitMQ 的死信队列功能实现消费者拒绝消息投递到死信交换机的行为,你可以按照以下步骤操作: 创建原始队列,并将其绑定到一个交换机上: export RABBITMQ_SERVER127.0.0.1 export RABBITMQ_PORT5672 export RAB…

BQ24650 MPPT管理控制芯片测试

BQ24650 MPPT管理控制芯片测试 10月1号开始焊接调试,1号下午开始进行充电测试,截止到10月3号晚上23:05(因为夜间无人监护,所以夜间断电,停止测试。)终于看到充电结束,进入浮充状态(绿灯亮、红灯灭)…

黄金替罪羊

题面 黄金替罪羊实在是太难玩了,所以开拓者弄了个简化版。 黄金替罪羊需要替罪羊和开拓者的配合一起完成任务。 地图可以认为是一棵带权树,每次开拓者会问你一个有序点对 (u,v),表示起点为 u 而终点为 v,在开拓者的…

现在网站如何做优化装修体验馆app

行级触发器:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值.:NEW 修饰符访问操作完成后列的值:OLD 修饰符访问操作完成前列的值例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被…

有没有帮人做数学题的网站网站建设需求和页面需求怎么提

文章目录出库单业务流程基本流程扩展流程找不到符合条件的仓库,要求部分退款(未生成出库单时)找不到符合条件的仓库,全部退款(未生成出库单时)找不到符合条件的仓库,等待库存补足(未…

JVM 深入研究 -- 详解class 材料

JVM 深入研究 -- 详解class 材料pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

网站开发的3个阶段工作计划范文

作者 | 飞向星的客机来源 | CSDN博客🌟 前言镜像是构建容器的蓝图,Docker 以镜像为模板,构建出容器。容器在镜像的基础上被构建,也在镜像的基础上运行,容器依赖于镜像。本文将对 容器的运行 及相关内容进行详细讲解。容…

Spring Boot 缓存科技详解

Spring Boot 缓存科技详解2025-10-04 21:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

制作网站能挣钱怎么制作网站发布

[react] 在React中怎么阻止事件的默认行为? event.preventDefault();阻止浏览器默认行为, 例如标签不跳转 event.stopPropagation();阻止冒泡; 例如上级点击事件不生效 个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很…

网站seo房屋经纪人网站端口怎么做

本期内容主要讲解的是关于在CST软件上电源直流压降仿真VRM的一些相关参数设置,小编我在之前文章中有说到过如何利用CST仿真电源信号的直流压降,不过有一些问题我这边再去补充一些。 首先就是VRM芯片的设置了,小编我还是按照之前那样设置&…