c++ - 赋值运算符是否调用复制构造函数?
问题描述
#include<iostream>
using namespace std;
class test
{
int *p;
public:
test(){p=new int(0);}
test(const test &src)
{
p=new int(*src.p);
}
~test(){delete p;}
void show(){cout<<*p<<" at "<<p<<endl;}
void setx(int a)
{
*p=a;
}
};
int main()
{
test a,b;
a.setx(10);
a.show();
b=a;
b.show();
test c=a;
c.show();
}
在 main() 内部,test c=a
调用复制构造函数并为整数分配内存。没问题,两者都c.p
指向a.p
不同的内存位置。但该行b=a
导致b.p
和a.p
指向相同的内存位置。我创建了自己的复制构造函数,b.p
并且a.p
应该指向不同的内存位置。这里发生了什么?
编辑:确切地说,我的问题是隐式定义的复制构造函数和隐式定义的复制赋值运算符有什么区别?
解决方案
b=a;
这里也完成了逐位复制(ap 和 bp 指向同一位置),它不会调用复制构造函数,因为在定义 b 时调用构造函数(默认构造函数)。所以你必须重载=
运算符
test &operator =(const test &src)
{
*this->p=*src.p; //copy value not address
return *this;
}
将此添加到您的类测试中,您需要检查内存是否被 new 分配,因为 new 可能无法分配请求的内存。
但是这里调用了复制构造函数
test c=a;
推荐阅读
- r - ggplot2 中的决策边界图
- symfony - 多对多关系中的多个联接
- javascript - 正确编写 javascript 正则表达式来拆分搅拌
- angularjs - 等待兄弟控制器的功能
- gprs - 通过调制解调器响应获取远程数据而不会中断
- java - Servlet 异常:方法抛出“java.lang.NoClassDefFoundError”
- javascript - AngularJS应用程序未显示要查看的数据
- android - html5视频在android原生webview中不起作用
- dialogflow-es - 有没有办法可以避免第二次触发意图?
- sql - 如何更新列中除最后一次出现的 ID 之外的所有值