开发者社区> 嗯哼9925> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

面试题1:赋值运算符函数

简介:
+关注继续查看
复制代码
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char *pData=NULL);//构造函数
CMyString(const CMyString& str);//拷贝构造函数
~CMyString();//析构函数
private:
char* m_pData;//数据域,字符指针
};
复制代码

介绍重载赋值

  重载操作符是一些函数,其名字为关键字operator后紧跟需要重载的运算符,比如"operator="表示需要重载"="。像任何其他函数一样,操作符函数有一个返回值和一个形参表。形参表必须具有与该操作符操作数数目相同的形参,但是如果操作符是一个成员函数,它的第一个操作数隐式绑定到this指针,因此形参表中的参数会减少一个。因为赋值运算符必须是类的成员函数,所以this绑定到左操作数的指针。因此,赋值操作符只接受一个形参,且该形参是同一类型的对象,右操作数一般作为const引用传递,跟拷贝构造函数相同。

  赋值操作符的返回类型应该与内置类型赋值运算的返回类型相同,内置类型的赋值运算返回对左操作数的引用,因此赋值操作符也返回对同一类类型的引用。赋值必须返回对*this的引用,也就是左操作数的引用。一般而言,赋值操作符与复合赋值操作符应返回左操作数的引用。

  从上述基础知识我们知道了重载赋值操作符是一个类的成员函数,这个函数的返回类型是左操作数的引用,也就是*this,并且这个函数的参数是一个同类型的常引用变量。通过上述知识我们可以确定重载操作符函数为:

CMyString& operator=(const CMyString& str);//重载运算符

完整的代码实现如下:

View Code

存在的问题:

在上述代码中,我们首先释放实例自身已有内存,

//释放实例自身已有内存
delete[] m_pData;
m_pData=NULL;

然后再去开辟一块内存空间让m_pData指向这块内存空间,

//在删除自身内存以后在重新new一个长度为len+1的字符数组,类似拷贝构造函数
int len=strlen(str.m_pData);
m_pData=new char[len+1];

最后使用strcpy进行字符串赋值。

strcpy(m_pData,str.m_pData);

如果因为内存不足,在new char[len+1]阶段抛出异常,那么这时候因为已经释放了m_pData,导致m_pData指向一个空指针,这样可能会导致程序崩溃。有两种方案解决上述问题:

  • 先用new分配新内容,然后删除自己已有内容,最后进行赋值。
  • 创建一个临时实例,交换临时实例与当前实例的m_pData。代码如下:
View Code

这样的一个好处是在运行完if语句以后,因为除了strTemp的作用于,该实例会自动调用析构函数,把strTemp.m_pData所指向的内存释放掉,而此时strTemp.m_pData指向的是实例原先m_pData指向的内存,并没有释放当前指向的pTemp这一块内存。还有一点是通过构造函数为临时实例分配内存,如果在new char过程中抛出异常,并没有改变该实例m_pData所指向的内容,也没有释放内存,所以是异常安全性的。

 

 

 本文转自xwdreamer博客园博客,原文链接文转:http://www.cnblogs.com/xwdreamer/archive/2012/05/14/2500632.html如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C语言入门笔记:运算符及取余%的坑
C语言入门笔记:运算符及取余%的坑
0 0
Lua 语法赋值运算符与算数运算符|学习笔记
快速学习 Lua 语法赋值运算符与算数运算符
0 0
赋值运算符|学习笔记
快速学习赋值运算符。
0 0
赋值运算符的特殊场景| 学习笔记
快速学习赋值运算符的特殊场景
0 0
赋值运算符的使用| 学习笔记
快速学习赋值运算符的使用
0 0
java学习第三天笔记-运算符08-自增和自减运算符50
java学习第三天笔记-运算符08-自增和自减运算符50
0 0
java学习第三天笔记-运算符09-自增和自减运算符51
java学习第三天笔记-运算符09-自增和自减运算符51
0 0
C语言及程序设计初步例程-17 赋值运算符与赋值表达式
贺老师教学链接  C语言及程序设计初步 本课讲解 赋值表达式及其值 #include <stdio.h> int main() { int a, b, c; printf("%d\n", (a=5)); printf("%d\n", (b=(c=6))); printf("%d %d %d\n", a, b, c); return 0; }
692 0
C++赋值运算符函数
为类添加赋值运算符函数: 类型定义 class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString &str); ~CMyString(void); ...
500 0
【C++学习】复制构造函数和赋值运算符根本的不同
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 首先要说明的是,若用户没有定义,C++隐式声明一个复制构造函数和一个赋值运算符(完成按数据成员复制的动作)。
554 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载