为什么赋值运算符要防止自身赋值
来源:互联网 发布:安居客盗图软件 编辑:程序博客网 时间:2024/06/07 01:10
为什么赋值运算符要防止自身赋值呢??
如果类里面含有指针指向动态分配的资源的话,那么自身赋值就可能出错
有可能导致把自己给释放了
如下面:
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
class A
{
public:
char *ptr;
A(){ptr = nullptr;}
void set_ptr(char *str){ptr = new char[strlen(str)+1]; strcpy(ptr,str);}
A& operator=(const A&rhs)
{
delete ptr;
ptr = new char[strlen(rhs.ptr)+1];
strcpy(ptr,rhs.ptr);
return *this;
}
};
int main()
{
A a;
a.set_ptr("hello world");
a = a;
cout<<a.ptr<<endl;
}//导致输出错误
下面有几种办法
1、判断参数是否是自身
那么就要重载==或者!=运算符
if(*this != rhs)
该运算符不止要判断数据成员的值是否相等
还要判断ptr的指向(即ptr的指针值是否相等)
那么这样的运算符失去了一般性(没必要判断ptr的指针值是否相等,而是判断指向的内容是否相等)
2、即先将右操作数的内容赋值到一个临时指针
然后释放左操作数指针指向的内存
然后将临时指针赋给左操作数的指针
class A
{
public:
char *ptr;
A(){ptr = nullptr;}
void set_ptr(char *str){ptr = new char[strlen(str)+1]; strcpy(ptr,str);}
A& operator=(const A&rhs)
{
char *temp = new char[strlen(rhs.ptr)+1];//复制资源到一个临时指针
strcpy(temp,rhs.ptr);
delete ptr;
ptr = temp;
return *this;
}
};
当然了,具体情况还是得针对类的具体实现来考虑
明白这个思想就行了
0 0
- 为什么赋值运算符要防止自身赋值
- 赋值操作符防止自身赋值的细节
- 为什么赋值运算符要返回引用?
- 为什么赋值运算符要返回引用?
- c++赋值运算符为什么要返回引用?
- C++赋值运算符重载,为什么要返回引用?
- 赋值运算符重载为什么要返回引用
- /c++赋值运算符为什么要返回引用
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 赋值运算符
- 布尔赋值运算符
- 复合赋值运算符
- 赋值运算符
- ECMAScript 赋值运算符
- 重载赋值运算符
- 赋值运算符
- 如何学好C++语言/C语言/
- 页面果滚动效果
- android国际化
- 线程间同步之 Mutex(mutual exclusion 互斥量)
- TDD: 解除依赖
- 为什么赋值运算符要防止自身赋值
- 电脑故障导致数据丢失如何恢复?
- Cassandra学习笔记之数据文件分布
- vs2010:error MSB4018 “CL”任务意外失败 (The "CL" task failed unexpectedly. )
- 设计模式五大原则
- 在linux命令行下编译执行java程序
- 重载与覆盖的区别
- 如何恢复u盘丢失的重要文件
- c# lock (obj) 与 lock (this) 区别