首页 > 代码库 > 赋值运算符函数的返回值类型详解
赋值运算符函数的返回值类型详解
在c++赋值运算符函数的学习中,对于返回值类型的问题,一直非常费解,今天彻底总结一些每种不同返回值类型的结果:
1、当返回值为空时:
<span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span>
这个时候如果只有一个‘=’(a = b)运算那就没问题,但是如果存在‘=’(a = b = c)的链式操作时,编译器就会报错
我们看:a = b = c;
程序会先运行 b = c;
因为函数的返回值为viod , 所以 b = c这个操作就会返回一个NULL
那么这是 a = (b = c) 也就是 a = NULL , 这种操作时不存在的 , 即使是存在也不符合我们对这个操作的初衷。
2、当返回值是 类本身时:
<span style="font-size:14px;">hasptr hasptr::operator=(const hasptr& s)</span>
支持‘=’的链式操作
如果返回值是类本身 , 那么这个函数运行的过程是:
1、进入函数内部,运行函数内部的操作
2、函数内部的操作运行完之后,调用类的拷贝构造函数,把对象拷贝给一个新的对象
3、返回那个新建立的对象
这里是关键是,每运行一次赋值运算符函数,就要调用一次拷贝构造函数,这样不仅会浪费时间。
如果类中没拷贝构造函数,有时候还会出错。
3、当返回值是引用时
<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)</span>
这种方式是最好的 , 即支持链式操作,还把操作时间降到了最低
完整代码:
<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s) { i = s.i; string *x = new string(*s.ps); delete ps; ps = x; return *this; }</span>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。