做培训的都上哪些网站廉江新闻最新消息

bicheng/2026/1/16 17:20:20/文章来源:
做培训的都上哪些网站,廉江新闻最新消息,专业网站建设费用报价,做网站需要的课程文章目录 写在前面1. 类的6个默认成员函数2. 构造函数2.1 构造函数的引入2.1 构造函数的特性 3. 析构函数3.1 析构函数的引入3.2 析构函数的特性 4. 拷贝构造函数4.1 拷贝构造函数概念4.2 拷贝构造函数的特性4.3 拷贝构造函数典型调用场景 5. 赋值运算符重载5.1 运算符重载5.2 … 文章目录 写在前面1. 类的6个默认成员函数2. 构造函数2.1 构造函数的引入2.1 构造函数的特性 3. 析构函数3.1 析构函数的引入3.2 析构函数的特性 4. 拷贝构造函数4.1 拷贝构造函数概念4.2 拷贝构造函数的特性4.3 拷贝构造函数典型调用场景 5. 赋值运算符重载5.1 运算符重载5.2 赋值运算符重载 6. const成员函数7. 取地址及const取地址操作符重载 写在前面 这篇文章详细介绍了类的 6 个默认成员函数它们是构造函数、析构函数、拷贝构造函数、赋值运算符重载、取地址和 const 取地址操作符重载以及const 成员函数。这些成员函数在 C 中是默认生成的默认成员函数在类的设计和实现中起着非常重要的作用下面我们来一一介绍。 1. 类的6个默认成员函数 如果一个类中什么成员都没有简称为空类。 空类中真的什么都没有吗并不是在 C 中即使一个类中看起来什么都没有编译器会自动生成以下6个默认成员函数。 默认成员函数用户没有显式实现编译器会生成的成员函数称为默认成员函数。 2. 构造函数 2.1 构造函数的引入 例如有如下一个类 #include iostream using namespace std;class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout _year / _month / _day endl;}private:int _year;int _month;int _day; };int main() {Date d1, d2;d1.Init(2024, 2, 5);d2.Init(2024, 2, 6);d1.Print();d2.Print();return 0; }对于上面的Date类可以通过 Init 公有方法给对象设置日期但如果每次创建对象时都调用该方法设置信息未免有点麻烦那能否在对象创建时就将信息设置进去呢 在C中为了让对象在实例化的时候能够完成初始化提供了构造函数。构造函数是一种特殊的成员函数用于在创建对象时对其进行初始化。在 C 中构造函数的名称与类名相同不返回任何值甚至没有 void 类型的返回值。构造函数的主要作用是初始化对象的数据成员确保对象在创建时有 一个合适的初始值。创建类类型对象时由编译器自动调用并且在对象整个生命周期内只调用一次。 2.1 构造函数的特性 函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。 构造函数可以重载。 如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦 用户显式定义编译器将不再生成。 关于编译器生成的默认成员函数我们会有疑惑不实现构造函数的情况下编译器会 生成默认的构造函数。但是看起来默认构造函数又没什么用d对象调用了编译器生成的默 认构造函数但是d对象_year/_month/_day依旧是随机值。也就说在这里编译器生成的 默认构造函数并没有什么用 其实不然这是因为C把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型如int/char…自定义类型就是我们使用class/struct/union等自己定义的类型看看下面的程序就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员 函数。 注意C11 中针对内置类型成员不初始化的缺陷又打了补丁即内置类型成员变量在 类中声明时可以给默认值。 无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个。 注意无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数都可以认为是默认构造函数。即不需要传参就可以调用的构造函数。 在实际编程中如果对象的初始化值不依赖于外部参数并且没有特殊的初始化需求编译器生成的默认构造函数就够用。如果对象的初始化值依赖于外部参数推荐缺省的默认构造函数因为全缺省的传不传参都可以调用。 3. 析构函数 3.1 析构函数的引入 例如有如下一个类 #include iostream using namespace std;class Stack {public:void Init(int capacity 4){int* tmp (int*)malloc(sizeof(int) * capacity);if (tmp nullptr){perror(malloc fail);exit(-1);}_nums tmp;_capacity capacity;_top 0;}void Destroy(){if (_nums){free(_nums);_nums nullptr;_capacity _top 0;}}void push(int x){//检查扩容//..._nums[_top] x;} private:int* _nums;int _top;int _capacity;}; int main() {Stack st;st.Init();st.push(1);st.push(1);st.push(1);st.Destroy();return 0; }对于上面的Stack类可以通过Destroy公有方法清理对象中的资源动态申请的空间但如果每次使用完对象时都调用该方法来主动的释放资源未免有点麻烦那能否在对象销毁之前就自动调用相关函数来清理对象中的资源呢 在C中可以通过析构函数来实现在对象销毁之前自动清理对象中的资源。析构函数是特殊的成员函数该函数与构造函数功能相反完成的不是对象的销毁局部对象销毁工作是由编译器完成的。而对象在销毁时会编译器会自动调用析构函数完成对象中资源的清理工作。 3.2 析构函数的特性 析构函数名是在类名前加上字符 ~。 无参数无返回值类型。 对象生命周期结束时C编译系统系统自动调用析构函数。 一个类只能有一个析构函数。若未显式定义系统会自动生成默认的析构函数。注意析构函数不能重载。 关于编译器自动生成的析构函数是否会完成一些事情呢下面的程序我们会看到编译器 生成的默认析构函数对自定类型成员调用它的析构函数。 #include iostream using namespace std; class B { public:B(int b 0){_b b;cout B(int b 0) endl;}~B(){cout ~B() endl;} private:int _b; };class A { public:private:int _a;B _bb; };int main() {A a;return 0; }上面程序运行结束后输出~B()。 而在main方法中根本没有直接创建B类的对象为什么最后会调用B类的析构函数 因为main函数中创建了A类的对象a而a中包含2个成员变量其中_a是内置类型成员销毁时不需要资源清理最后系统直接将其内存回收即可而_bb是B类对象所以在a销毁时要将其内部包含的B类的_bb对象销毁所以要调用B类的析构函数。但是main函数中不能直接调用B类的析构函数实际要释放的是A类对象所以编译器会调用A类的析构函 数而A没有显式提供则编译器会给A类生成一个默认的析构函数目的是在其内部调用B类的析构函数即当A对象销毁时要保证其内部每个自定义对象都可以正确销毁main函数中并没有直接调用B类析构函数而是显式调用编译器为A类生成的默认析构函数。 注意创建哪个类的对象则调用该类的构造函数销毁那个类的对象则调用该类的析构函数。 如果类中没有申请资源时析构函数可以不写直接使用编译器生成的默认析构函数比如Date类有资源申请时一定要写否则会造成资源泄漏比如Stack类。 4. 拷贝构造函数 4.1 拷贝构造函数概念 拷贝构造函数是C中的一种特殊成员函数它通常用于在对象创建时使用一个现有对象的内容来初始化新对象从而实现对象的拷贝。 拷贝构造函数只有单个形参该形参是对本类类型对象的引用(一般常用const修饰)在用已存在的类类型对象创建新对象时由编译器自动调用。 语法形式如下 class Date { public://默认构造函数Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}//拷贝构造函数使用同类类型的对象初始化Date(const Date d){_year d._year;_month d._month;_day d._day;} private:int _year;int _month;int _day; };int main() {Date d1(2024, 2, 6);Date d2(d1);//使用 d1 拷贝构造 d2return 0; }4.2 拷贝构造函数的特性 拷贝构造函数是构造函数的一个重载形式。 需要注意的是显示的写了拷贝构造以后编译器就不会生成拷贝构造函数了同时默认构造函数编译器不会生成了因为拷贝构造函数也是构造函数。 拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错因为会引发无穷递归调用。 若未显式定义编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按 字节序完成拷贝这种拷贝叫做浅拷贝或者值拷贝。 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了还需要自己显式实现吗 当然像上面这种类是没必要的。那么下面的类呢 #include iostream using namespace std;class Stack {public://构造函数Stack(int capacity 4){int* tmp (int*)malloc(sizeof(int) * capacity);if (tmp nullptr){perror(malloc fail);exit(-1);}_nums tmp;_capacity capacity;_top 0;}//析构函数~Stack(){cout ~Stack() endl;if (_nums){free(_nums);_nums nullptr;_capacity _top 0;}}private:int* _nums;int _top;int _capacity; }; int main() {Stack st1;Stack st2(st1);//st1拷贝构造st2return 0; }当我们运行上面的程序时发现代码崩溃下面我们来分析一下为什么代码会崩溃呢 因此我们得出结论类中如果没有涉及资源申请时拷贝构造函数是否写都可以一旦涉及到资源申请时则拷贝构造函数是一定要写的否则就是浅拷贝。 4.3 拷贝构造函数典型调用场景 现有如下一个Date类 #include iostream using namespace std; class Date { public:Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}Date(const Date d){cout Date(const Date d) endl;_year d._year;_month d._month;_day d._day;}private:int _year;int _month;int _day; };使用已存在对象创建新对象 int main() {Date d1;Date d2(d1);//使用 d1 拷贝构造 d2Date d3 d2;//使用 d2 拷贝构造 d3return 0; }运行结果如下 2. 函数参数类型为类类型对象 void func(Date d) {cout void func(Date d) endl; } int main() {Date d1;func(d1);return 0; }运行结果如下 3. 函数返回值类型为类类型对象 结论为了提高程序效率一般对象传参时尽量使用引用类型返回时根据实际场景能用引用尽量使用引用。 5. 赋值运算符重载 5.1 运算符重载 C为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数也具有其返回值类型函数名字以及参数列表其返回值类型与参数列表与普通的函数类似。有了运算符重载以后可以根据需求使得自定义类型的对象也可以像内置类型一样使用操作符。 函数名字为关键字operator后面接需要重载的运算符符号。 函数原型返回值类型 operator操作符(参数列表)。 关于运算符重载有一下几点需要注意 不能通过连接其他符号来创建新的操作符比如operator 。只能重载现有的操作符比如 operatoroperator等。重载操作符必须有一个类类型参数。用于内置类型的运算符其含义不能改变例如内置的整型不能改变其含义。作为类成员函数重载时其形参看起来比操作数数目少1因为成员函数的第一个参数为隐藏的this。.* :: sizeof ?: . 注意以上5个运算符不能重载。 举个例子比如想比较两个日期是否相等。 之前我们想比较两个日期的大小需要写一个比较大小的函数现在有了运算符重载我们可以重载运算符 ’ ’ 使得Date类的对象可以像自定义类型一样使用运算符’ ’ 来判断两个日期是否相等。 #include iostream using namespace std; class Date { public:Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}Date(const Date d){_year d._year;_month d._month;_day d._day;} //private:int _year;int _month;int _day; }; //运算符 重载重载成全局的 bool operator(const Date d1, const Date d2) {return d1._year d2._year d1._month d2._month d1._day d2._day; } int main() {Date d1(2024, 2, 6);Date d2(2024, 2, 7);cout (d1 d2) endl;//这里d1 和 d2可以像内置类型一样使用操作符return 0; }代码运行结果 上面将运算符重载成全局的有个很大的问题上面能运行是因为将成员变量的访问限定符改成了public就是运算符重载成全局的就需要成员变量是公有的那么问题来了封装性如何保证 这里其实可以用我们后面学习的友元来解决或者干脆重载成成员函数。 因此正确的写法为 class Date { public:Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}Date(const Date d){_year d._year;_month d._month;_day d._day;}// 运算符 重载重载成成员函数// bool operator(Date* this, const Date d)// 这里需要注意的是左操作数是this指向调用函数的对象bool operator(const Date d){return _year d._year _month d._month _day d._day;} private:int _year;int _month;int _day; }; int main() {Date d1(2024, 2, 6);Date d2(2024, 2, 7);cout (d1 d2) endl;//这里d1 和 d2可以像内置类型一样使用操作符//上面那样写是为了提高代码的可读性我们也可以像下面这样显示的调用cout (d1.operator(d2)) endl;//bool operator(Date* this, const Date d2)return 0; }总结运算符函数可以定义为类的成员函数或全局函数。如果运算符函数是类的成员函数它将自动获得一个隐含的 this 指针用于访问调用对象的成员如果是全局函数则需要在参数列表中显式地传递所有操作数。 5.2 赋值运算符重载 赋值运算符重载是指重载类中的赋值运算符使得用户能够对自定义类型的对象进行赋值操作。通过赋值运算符重载可以实现类对象之间的拷贝。 语法格式为 参数类型const T传递引用可以提高传参效率。 返回值类型T返回引用可以提高返回的效率有返回值目的是为了支持连续赋值。 检测是否自己给自己赋值。 返回*this 要复合连续赋值的含义。 //T是类型名 T operator(const T 变量名) {// 执行赋值操作// 返回 *this }赋值运算符只能重载成类的成员函数不能重载成全局函数。 正确做法如下 3. 用户没有显式实现时编译器会生成一个默认赋值运算符重载以值的方式逐字节拷贝。注意内置类型成员变量是直接赋值的而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。 既然编译器生成的默认赋值运算符重载函数已经可以完成字节序的值拷贝了还需要自己实现吗当然像日期类这样的类是没必要的。像前面我们介绍拷贝构造函数那里的Stack类一样我们发现程序就会崩溃掉。 原因如下 总结如果类中未涉及到资源管理动态申请空间赋值运算符是否实现都可以一旦涉及到资源管理赋值运算符则必须要实现。 6. const成员函数 使用const修饰的“成员函数”称之为const成员函数const修饰类成员函数实际修饰该成员函数隐含的this指针表明在该成员函数中不能对类的任何成员进行修改。并且在函数声明和定义中都需要加上 const 关键字。 语法如下 返回类型 函数名() const {// 函数体 }经过上面的介绍我们来思考如下几个问题 const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗 7. 取地址及const取地址操作符重载 这两个默认成员函数一般不用重新定义 编译器默认会生成。 class Date { public:Date* operator(){return this;}const Date* operator() const{return this;} private:int _year;int _month;int _day; };这两个运算符一般不需要重载使用编译器生成的默认取地址的重载即可只有特殊情况才需 要重载比如想让别人获取到指定的内容 至此本片文章就结束了若本篇内容对您有所帮助请三连点赞关注收藏支持下。 创作不易白嫖不好各位的支持和认可就是我创作的最大动力我们下篇文章见 如果本篇博客有任何错误请批评指教不胜感激

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

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

相关文章

北京网站制作策划大都会app最新版本下载

http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/Default.aspx div圆角 tags 日期控件等等转载于:https://www.cnblogs.com/freedom831215/archive/2011/12/13/2286051.html

东莞购物网站音乐网站开发编程语言

在数字化时代,数据传输的同步技术对于确保信息的一致性和通信质量至关重要。本文将探讨数据传输同步技术的种类、如何实现高效安全的数据传输,以及企业在数据迁移中常用的几种方式。最后,我们将重点介绍镭速大数据迁移工具的优势。 数据传输同…

威海做网站的哪家好关于门户网站建设方案

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

没有做网站经验可以学seo吗wordpress直排主题

目 录 1 绪论 1.1 选题背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 课堂考勤系统系统分析 2.1 可行性分析 2.1.1技术可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.3 系统用例分析 2.4 系统流程分析 2.…

宝丰县建设局网站wordpress仿百度首页

Python这个编程语言的大名当然听说过了呀,这几年特别火,火的一塌涂地。大家可以回忆一下:朋友圈推荐的广告里经常可以看见python的网课广告。 本学期,学校开设了python课程,这几天学习了一下入了一下门,感…

南通的互联网公司网站专业团队打造专业品质

一、memcpy —— 内存拷贝 void * memcpy ( void * destination, const void * source, size_t num ); memcpy函数用于将源内存区域的内容复制到目标内存区域。功能是将从source指向的内存起始位置连续num个字节的数据,原样复制到destination指向的内存区域。 例…

江苏苏州建设行政主管部门网站网站域名注册人查询

1. deque deque 容器用数组(数组名假设为 map)存储着各个连续空间的首地址。也就是说,map 数组中存储的都是指针如果 map 数组满了怎么办?很简单,再申请一块更大的连续空间供 map 数组使用,将原有数据&…

织梦做的网站怎么发布茶叶网站制作模板

目录 一、C中STL(Standard Template Library) 二、 Gun源代码开发精神 三、 实现版本 四、GNU C库的头文件分布 bits目录 ext目录 backward目录 iostream目录 stdexcept目录 string目录 上一篇文章: C标准模板库(STL&am…

中华建设杂志社网站专业的公司网站制作服务

幸运票 题目大意&#xff1a; 一个长度为2N的序列&#xff0c;这些数的总和为S&#xff0c;当这个序列的前N个和后N个总和相等时&#xff0c;它是符合题意的&#xff0c;问有符合题意的有多少种可能 样例输入 2 2 样例输出 4 数据范围限制 1<N<50 S<1000 解…

昆明网站建设搜王道下拉做一个网站平台的流程是什么

当你想要从数据库中删除数据时&#xff0c;PHP可以帮你实现这个功能。以下是一些简单的步骤和代码示例&#xff0c;帮助你从新手的角度用幽默的语气回答如何使用PHP删除数据。 首先&#xff0c;你需要连接到数据库。这可以通过使用PHP中的mysqli_connect函数来实现。以下是连接…

制作平台网站方案品牌vi设计公司企业

因为我也是一个初学者&#xff0c;所以可能有出错的地方&#xff0c;如果有希望大家告诉我QQ:7343696.大家公共学习&#xff0c;进步。Oracle的安装实验的环境是vmware server 1.06 rehl 5.2最小安装。oracle安装的要求。1建议的内存1G&#xff08;10g&#xff09; 9i中是51…

国内最好的网站建设网站简单设计

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目翻译有些烂&#xff0c;我来二次翻译一下&#xff0c;找出数组中k个两两互不相邻的数&#xff0c;求出它们的最大值。要求最大值尽可…

广州公司网站wordpress 视频教程

首先声明&#xff0c;这只是一种登录方式&#xff0c;并不是最好的方式&#xff0c;用这个例子为了说明登录窗体和Application的关系。在登录前&#xff0c;定义了用户实体&#xff0c;然后是一个通用的类&#xff0c;存放进程中当前登录的用户&#xff0c;所以CurrentUser是静…

网站设计价格大概多少自己做的网站不备案不能访问吗

目录 局部函数与闭包函数的关联 变量捕获与状态保留 应用场景的交集与差异 闭包的本质 局部函数示例 闭包函数示例 局部函数和闭包函数之间存在着密切的联系&#xff0c;同时也有一些本质的区别。 局部函数与闭包函数的关联 局部函数&#xff08;Nested Function&#…

学网站开发需要多久北京高端网站定制公司

一、本地项目如何连接git远程仓库 第一步&#xff0c; 首先我们在git上新建仓库。 第二步&#xff0c;打开本地项目文件夹&#xff0c;鼠标右键选择Git Bash Here 。 第三步&#xff0c;输入git init 命令&#xff08;在目录中创建新的 Git 仓库&#xff09;。 第四步&#xff…

网站建设部署与发布网站前台建设用到哪些工具

简介 CodeGeeX2 是多语言代码生成模型 CodeGeeX (KDD’23) 的第二代模型。不同于一代 CodeGeeX&#xff08;完全在国产华为昇腾芯片平台训练&#xff09; &#xff0c;CodeGeeX2 是基于 ChatGLM2 架构加入代码预训练实现&#xff0c;得益于 ChatGLM2 的更优性能&#xff0c;Co…

赣州酒店网站建设网站开发售后服务承诺

一、消息中间件的使用场景 消息中间件的使用场景总结就是六个字&#xff1a;解耦、异步、削峰 1.解耦 如果我方系统A要与三方B系统进行数据对接&#xff0c;推送系统人员信息&#xff0c;通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整&#xff0c;或者推送过…

上海昆山网站公司哪家好wordpress指定域名

Queue 的定义和结构 队列(Queue) 是只允许在一端进行插入&#xff0c;在另一端进行删除的线性表 队列是一种先进先出(First In First Out)的线性表&#xff0c;简称 FIFO(First IN First OUT), 允许插入的一端称为队尾, 允许删除的一端称为队列头 队列的基本结构如下图所示&a…

怎样建立网站ip地址建一个网站需要多长时间

可以将 nginx 作为一个非常高效的 HTTP 负载均衡器&#xff0c;将流量分配到多个应用服务器上&#xff0c;并通过 nginx 提高 Web 应用的性能、可扩展性和可靠性。 nginx 可以通过添加一个 upstream&#xff0c;来实现 nginx 的负载均衡功能。 upstream myserver {server 192…

北京金创网站建设怎么免费建立自己的网站

1.前言 在11.0的系统开发中,在做系统定制化开发中,在对系统的静态壁纸做定制的时候,需要增加几种静态壁纸可以让用户自己设置壁纸,所以可以在壁纸的系统应用中 添加几种静态壁纸图片,然后配置好 就可以在选择壁纸的时候,作为静态壁纸,接下来看如何具体实现这个功能 2.增…