C++赋值运算符重载
来源:互联网 发布:域名升级访问8jmv 编辑:程序博客网 时间:2024/04/29 05:34
C++赋值运算符重载,为什么要返回引用?查了许多资料,基本有两种说法:
一、c、c++赋值运算符的本意为“返回左值的引用”(左值:赋值号左面的变量而非其值)
可用以下程序段测试
int a,b=3,c=2;
(a=b)=c;
cout<<a<<endl;
对于x=y(x,y均为对象时),若不返回左值的引用,将会生成临时对象。 如果不处理x=y=z这样的表达式,也会正常(只是会调用拷贝构造函数和析构函数处理临时对象)。
二、为了进行连续赋值,即x=y=z
资料上都没有详细解释。现做分析如下:
1、赋值返回引用
x=y=z 先执行y=z,返回y的引用,执行x=y
2、赋值不返回引用
x=y=z 先执行y=z,返回用y初始化的临时对象(注意临时对象都是常对象),再执行x=y的临时对象(要求operator=(const X&) ),返回用x初始化的临时对象(此处要求拷贝构造函数必须为X(const X&) )。
所以也并非必须返回引用,返回引用的好处既可以于赋值的原始语义已知,又可避免拷贝构造函数和析构函数的调用。
以下程序中,可以去掉红色部分的任一处,或全部去掉以做测试。
#include <iostream>
#include <cstring>
using namespace std;
class String{
char *str;
public:
String(){str=NULL;}
String(char *s){str=new char[strlen(s)+1];strcpy(str,s);}
String(const String &s){str=new char[strlen(s.str)+1];strcpy(str,s.str);}
String &operator=(const String &s)
{
if(this==&s) return *this;
delete []str;
str=new char[strlen(s.str)+1];strcpy(str,s.str);
return *this;
}
~String(){delete []str;}
friend ostream& operator<<(ostream& out,const String &s);
};
ostream& operator<<(ostream& out,const String &s)
{
out<<s.str;
return out;
}
int main()
{
String s1,s2,s3("qweqwe");
s1=s2=s3;
cout<<s1<<endl;
return 0;
}
- C++:赋值运算符重载
- 重载赋值运算符(c/c++)
- 重载赋值运算符(c++)
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 赋值运算符重载
- 赋值运算符重载
- 重载赋值运算符
- 重载赋值运算符
- 赋值运算符重载
- 赋值运算符重载
- 重载赋值运算符
- 赋值运算符重载函数[C/C++/C#]
- [C++]拷贝构造函数和赋值运算符重载
- 给纯SDK程序加上自己的ICO图标
- 今天洗凉水澡
- 一些谈话的技巧.绝非奇技淫巧
- AOP技术基础
- 标准数组--向量(2)
- C++赋值运算符重载
- 利用"线段树"相关算法解决有关数组的问题[待续]
- 基于顺序表长度计算的相关结点定位算法
- Excel会计应学35招秘技
- ASP.Net:基于窗体的身份验证
- C++中有关volatile关键字的作用--阻止编译器将其变量优化缓存到寄存器(和线程相关)(转自百度)
- C#常用正则表达式
- java中的同步与异步
- “无形参函数”利用汇编代码传递变量地址 [有点意思]