对于C++类:显示地写出拷贝构造函数,重载赋值操作符和析构函数是良好的习惯,但在写构造函数时需要注意一些容易出现的错误,如下面的代码:
#include <iostream>
using namespace std;
class M{
public:
M(){}
M(const M &m){
cout<<"copy construtor"<<endl;
operator =(m);
}
M operator =(const M &m){ //问题出在此处
cout<<"operator ="<<endl;
return *this;
}
};
int main() {
M m1;
M m2;
m2=m1;
return 0;
}
在下面三种情况下会调用拷贝构造函数:
(1)用一个已经实例化了的该类对象,去实例化该类的另外一个对象;
(2)用该类的对象传值的方式作为一个函数的参数;
(3)一个函数返回值为该类的一个对象。
特别地,对于语句
M m; M mm=m; 属于(1)情况,即语句M mm=m;调用的是拷贝构造函数,而不是构造函数。
但在重载=操作符时,返回值不是引用类型将导致程序运行出现严重问题。即如果出现上面会调用拷贝构造函数的三种情况之一,或者使用=操作符时,拷贝构造函数和operator =将循环递归调用,导致程序出现死循环。原因是拷贝构造函数和operator =之间不断地重复调用。
解决办法:将operator =的返回类型改为引用类型M&,此时调用operator =时不会去调用拷贝构造函数。
还有,若要写clone时,若通过下面的方式:
M clone(){
cout<<"clone"<<endl;
return *this;
}
前提是拷贝构造函数不能调用clone来完成拷贝,否则出现上面同样的问题,下面的代码就会出现这样的问题
M(const M &m){
cout<<"copy construtor"<<endl;
clone();
}
总之,在写这些函数时,要特别留意彼此的调用关系。
以下是我的惯用写法:
(A)对于拷贝构造函数和重载=操作符
M(const M &m){
cout<<"copy construtor"<<endl;
operator =(m);
}
M& operator =(const M &m){ //问题出在此处
cout<<"operator
="<<endl;
/* 此处写上成员数据的拷贝 */
return *this;
}
这里写成了inline函数,只是方便说明问题,其实不必非要这么写,可以采取先声明,后定义的常规方法。
(B)对于clone函数
声明: virtual M clone(); //考虑继承时的多态
定义: M M::clone(){
cout<<"clone"<<endl;
//将在调用处直接调用构造函数,效率高,避免返回局部变量,更安全
return M();
}
分享到:
相关推荐
c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++...
原创Matlab克隆优化函数-clone.m 这是一个克隆优化函数的程序,希望对大家有用
实现以下类的构造、复制构造、赋值运算符以及clone()和draw()函数,其中draw()函数只要求输出一个表示是哪个类的draw函数的字符串 在main()函数中写代码测试这些类的功能,尤其应使用一个Node类的指针去调用各个类的...
Jlink v8固件修复或解决Clone问题,内有固件下载地址。
(实战)[re:Invent 2018]-001:赛道分析-(致敬1024) 配套 train and evaluation log
java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。
用于计算 Wigner D 矩阵、自旋加权球谐函数以及球体上函数所需的相关量的 C++ 库。 Python 绑定是通过 SWIG 提供的。 这些函数是根据四元数编写的,但已被重载以将欧拉角作为参数。 在这些函数中直接使用四元数的...
Java中对象的创建 clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。...分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后
中文语音克隆内含数据集和预训练模型:voice clone
今天小编就为大家分享一篇关于Java Clone深拷贝与浅拷贝的两种实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
git clone 最新版 不多说上资源 好用测试ok git clong git clone 最新版 不多说上资源 好用测试ok git clong
支持多个git库clone,提交等常用操作,用户需要根据实际情况微调参数
Clone 属性的相关内容 Clone 属性的相关内容
解决git clone时报错问题:sign_and_send_pubkey: signing failed: agent refused operation
彻底解决Mac端git clone/push速度太慢的问题,详情请参阅文档。
给大家介绍了jQuery中clone()函数实现表单中增加和减少输入项的实例代码,非常不错,具有参考借鉴价值,需要的朋友参考下吧
arcgis Pro深度学习环境部署教程,clone一个名字为plam-detection的工程环境;clone的位置在C:\Users\admin\AppData\Local\ESRI\conda\envs可以去在Pro的project下切换环境。(安装完Pro后默认的conda的环境位置:C:...
Worms clone game. Developed in C++, using SDL as graphics/events library. Licence: Zlib. Game supports a simple shooting weapon and "ninja cord". If you have any doubt please contact me.
WINDOWS 64位系统中安装mdk5.0以后,解决JLINK V8的固件升级和clone 问题
Clone10-EX-LV2