C++构造析构赋值运算函数怎么应用


这篇文章主要介绍“C++构造析构赋值运算函数怎么应用”的相关知识,小编通过实际案例向大家展示操作过程,操免费云主机域名作方法简单快捷,实用性强,希望这篇“C++构造析构赋值运算函数怎么应用”文章能帮助大家解决问题。当实现一个空类,c++会为你补上构造函数,拷贝构造函数,拷贝赋值运算符,析构函数当这些函数被调用是,才会被编译器创建出来。如果你自己声明了一个构造函数,编译器将不会创建默认构造函数。当然,编译器有时会拒绝生成operator=所以如果打算在一个含有引用成员的class中支持赋值操作,必须要自己定义operator=()若不想使用编译器自动生成的函数,就该明确拒绝如果一个类你想让它是独一无二,无法被拷贝的,则需要拒绝编译器生成的copy构造函数和copy赋值运算符。方法一:将copy构造函数和copy赋值运算符函数声明为private并且故意不实现因为所有编译器生成的版本都是public。声明一个成员函数,阻止了编译器自己创建它,而声明为private,又可以阻止别人调用它。客户试图拷贝A对象时,编译器会阻止,而当在member或friend函数之内调用时,连接器阻止.方法二:写一个父类,将copy构造函数和copy赋值运算符函数声明为private并且故意不实现,再继承这个父类。我的理解是:如果不这样做,在delete父类的指针的时候无法使用多态性质,只会删除掉父类的部分,而子类的部分会无法删除,造成局部销毁。所以:无虚不基base class的析构函数一定得是vritual,且可以推广到其他函数,若一个class里面没有一个virtual函数,那它不适合当一个base class。但是,析构函数不能无端声明为virtual,因为声明为virtual需要虚表指针(vptr),vptr也是要占内存的,会增加对象的体积,减缓运行速度。所以:当class至少含有一个virtual函数,才为它声明vritual虚构函数当然,也可以将虚构函数声明为纯虚函数,使该class成为一个抽象基类,注意:必须为这个纯虚函数提供一份定义。因为析构函数是从派生类开始往基类调用,所以编译器会在A的派生类的析构函数中调用~A()。C++不喜欢析构函数出现异常。可以在发生异常时终止程序,也可以吞下发生的异常如果某个操作可能在失败时抛出异常,而又必须要处理这个异常,这个异常必须来自析构以外的函数。(这里其实不太理解,文中给的例子是用一个新的成员函数来直行关闭)我的理解是:在构造和析构的过程中调用的virtual成员函数并没有多态性质(注意该虚函数不是指析构函数和构造函数是虚函数,而是除此之外的一个成员函数)派生类的base class成分会在派生类自身成分构造之前先构造,而A的构造函数调用了虚函数xxx,这时xxx是A的xxx,而不会多态调用B的xxx,即使目前是在创建B对象。根本原因是:在派生类的基类构造期间,对象的类型是基类而不是派生类,只有当派生类自己的部分开始执行时,该对象才变成一个派生类。该道理同样用于析构函数改法为:将A类的xxx改为non-vritual,在派生类的构造函数传递必要信息给基类的构造函数在构造期间,令派生类将必要的构造信息向上传递给基类的构造函数。为了实现连锁赋值,赋值操作符必须返回一个reference指向操作符的左侧,这是为class实现赋值操作符时必须遵守的协议。自我赋值发生在对象赋值给自己本身,例如*px=*py;px和py都指向一个对象,则是一个自我赋值。常发生在用引用赋值,指针赋值,多态等可能会引发delete时将赋值和被赋值对象都删除了避免方法:1、证同测试2、调整语序3、使用copy and swap,不大推荐如果自己定义了拷贝构造函数,编译器将不会提醒你是否拷贝完所有成分,如果为class添加一个成员变量,则必须修改所有的copy函数和非标准形势的operator=给派生类写copy函数的时候,也要复制它的基类的成分,那些成分往往是private,所以要让派生类调用相应的base class函数编写copy函数时:1、复制所有local成员变量2、调用所有base classes内的适当copying函数且不要尝试以某个copy函数实现另一个copy函数关于“C++构造析构赋值运算函数怎么应用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: thinkphp如何查询是否有数据

这篇文章主要讲解了“thinkphp如何查询是否有数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“thinkphp如何查询是否有数据”吧! thinkphp查询是否有数据的方法:1、打开相应的tp文件;2、通…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/02 22:09
下一篇 04/02 22:09

相关推荐