当前位置: 首页 > news >正文

高要区公路建设规划局网站微信软件如何开发

高要区公路建设规划局网站,微信软件如何开发,如何做网站开屏,wordpress用户函数C拷贝构造函数详解 什么是拷贝构造函数#xff1f;拷贝构造函数的特征默认拷贝构造函数为什么需要显示定义构造函数#xff1f;拷贝构造函数的调用场景什么时候不需要自己定义拷贝构造函数 什么是拷贝构造函数#xff1f; 在现实生活中#xff0c;拷贝构造函数就好像我们上… C拷贝构造函数详解 什么是拷贝构造函数拷贝构造函数的特征默认拷贝构造函数为什么需要显示定义构造函数拷贝构造函数的调用场景什么时候不需要自己定义拷贝构造函数 什么是拷贝构造函数 在现实生活中拷贝构造函数就好像我们上学时候干的一件事——抄作业doge但在现实生活中这是件不好的事但是在类和对象中拷贝构造函数确是一个作用极大的东西。 在创建对象时能否船创建一个与已经存在对象一模一样的对象呢当然可以这时候就要使用拷贝构造函数了。 拷贝构造函数 只有单个形参该形参是对 本类类型对象的引用(一般常用const修饰)在用 已存在的类类型对象创建新对象时由编译器自动调用。 对于内置类型就相当于 int a b这样用b来构造a 注意: 构造和赋值是两件不一样的事看下面一段代码 //拷贝构造 int b 10; int a b;//赋值 int a 10, b; b a;拷贝构造函数的特征 拷贝构造函数也是特殊的成员函数之一 拷贝构造函数是构造函数的一个重载形式拷贝构造函数的参数只有一个且必须是类对象的引用使用传值方法编译器会强制检查报错因为会引发无穷递归问题。 相信这里大家一定会有疑惑为什么传值的方法会引发无穷递归的问题 看下面一段代码 #includeiostream class Date { private:int _year;int _month;int _day; public:Date(int year 1970, int month 1, int day 1){_year year;_month month;_day day;}Date(const Date d){std::cout Date(const Date d) std::endl;_year d._year;_month d._month;_day d._day;} }void func(Date d) {}int main() {Date d1(2023,5,1);func(d1);return 0; }上面这段代码的运行结果如下 这说明了什么问题 我们使用了拷贝构造函数可是在哪里使用的呢从代码上看并没有看到我们使用了拷贝构造啊 这里就涉及到一个经典的问题了还记得形参和实参之间的关系吗没错就是她俩在搞鬼 形参是实参的临时拷贝形参是实参的临时拷贝形参是实参的临时拷贝 重要的事情说三遍没错正是因为这个性质在调用func函数时我们将d1传给形参d就发生了用d1来拷贝复制形参的出现那么有了这一个理解我们就能了解为什么在设计拷贝构造函数的时候不能使用传值调用了。 因为如果用传值调用效率不高是一个另外一个就是调用拷贝复制函数时形参和实参之间的复制需要一直调用拷贝构造就会出现无限递归的情况具体看下图 因此现在的编译器为了避免这种无限递归的产生会对复制构造函数传值的设计进行强制的检查一旦我们用传值的方式设计拷贝构造函数将无法完成编译。 默认拷贝构造函数 若未显示定义编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象对内置类型是按照字节方式直接拷贝的这种拷贝又叫做浅拷贝或者叫值拷贝而对自定义类型是调用其拷贝构造函数来完成拷贝的。 在前面日期类的基础上我们再创建一个类来测试一下这个特性。 #includeiostream class Date { private:int _year;int _month;int _day; public:Date(int year 1970, int month 1, int day 1){_year year;_month month;_day day;}Date(const Date d){std::cout Date(const Date d) std::endl;_year d._year;_month d._month;_day d._day;} }; class Time { private:int hour;int min;int second;Date x; };int main() {Time d1;Time d2(d1);return 0; }可以看到我们并没有定义Time类的拷贝构造所以使用的是系统自动生成的默认拷贝构造函数而从运行结果看其确实符合上诉所说的特性。 为什么需要显示定义构造函数 大家刚接触到拷贝构造函数的时候一定有一个问题竟然编译器生成的拷贝构造函数已经可以完成字节序的值拷贝了那还需要显示定义吗也许对日期类这种比较简单的类不需要那如果是更复杂的一些类呢看下面的例子 typedef int DataType; class Stack { public:Stack(size_t capacity 10) {_array (DataType*)malloc(capacity * sizeof(DataType)); if (nullptr _array) {perror(malloc申请空间失败); return;}_size 0;_capacity capacity;}void Push(const DataType data) {// CheckCapacity();_array[_size] data; _size;}~Stack(){if (_array){free(_array); _array nullptr;_capacity 0; _size 0;}} private:DataType* _array;size_t _size;size_t _capacity; };int main() {Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2(s1);return 0; } 上面这段代码在运行之后将会崩溃为什么呢我们首先来看看定义的两个stack对象里保存的东西 两个对象动态申请的数组指向同一块空间这就是默认拷贝构造函数带来的后果而如此造成的结果并不是我们想要的在程序结束调用析构的时候将会对同一块空间释放两次因此会造成错误。 因此类中如果没有涉及资源申请时拷贝构造函数是否写都可以一旦涉及到资源申请时则拷贝构 造函数是一定要写的否则就是浅拷贝。 拷贝构造函数的调用场景 使用已存在对象创建新对象函数参数为类类型对象(形参的拷贝创建)函数返回值类型为类类型对象创建临时变量 什么时候不需要自己定义拷贝构造函数 类成员都是自定义类型所有的成员都只需要浅拷贝就能完成任务 好了以上就是这篇博客的全部内容如果大伙发现博主哪里写的有问题或者有疑惑的话欢迎评论区指出
http://www.hkea.cn/news/14500192/

相关文章:

  • 房地产企业网站模板免费下载免费模板下载个人简历
  • 网站营销单页怎么设计方案湖南手机响应式网站建设企业
  • 做服装店网站的素材大连企业网站模板
  • 专业做商铺的网站wordpress crossapple
  • 湛江做网站的公司客户关系管理系统软件
  • 网站建设图片如何加载济南网站建设培训班
  • wordpress扫码下载文件博客seo怎么做
  • 邯郸网站制作官网有机蔬菜网站是如何建设
  • 网站运营需要哪些技术推广普通话奋进新征程手抄报
  • 单位建网站的详细步骤租赁服务器做电影网站
  • 抢购网站源码施工企业安全生产评价表下载
  • 网站托管运营所需资料一鸣东莞网站建设公司
  • 聚名网是什么平台沈阳网络seo公司
  • 手机网站用户体验小说网站的阅读界面怎么做的
  • win7系统做网站服务器系统人工智能培训机构排名前十
  • 海淀网站制作服务公司找客户的十大方法
  • 专门做logo的网站网站适配移动端和PC端
  • 网站模板怎么建设什么类型的网站好做
  • 网站的icp备案网站未授权cas要怎么做
  • 高埗镇做网站wordpress数据库越来越大
  • 成都网站建设与网站推广培训前端网站建设插件
  • 织梦网站最下面的网站建设去除哪里有学习网站建设
  • 衡水wap网站建设价格网站空间租
  • 南充网站建设网站爬知乎文章做网站
  • 苏州网站建设免费昆明网站设计制造
  • 网站建设的要求有哪些58网站建设的目的
  • seo网站推广杭州wordpress镶入thinkphp
  • 网站开发php jsphp网站模板制作工具
  • 网站管理机制建设情况谷歌关键词排名查询
  • 德芙巧克力网站开发方案电子商务网页设计是什么