您的位置:首页 > 其它

关于函数返回类类型可否作为左值

2012-06-17 21:25 260 查看
#include<iostream>
#include<ostream>
#include<string>
using namespace std;

class A
{
friend ostream& operator<<(ostream& out, const A & a)
{
out<<a.str;
return out;
}

public:
string str;
A(string s):str(s){}
A& operator=(const A&);
A& operator+=(const A&a)
{
this->str+=a.str;
return *this;
}

};

A operator +(const A& lhs,const A& rhs)
{
A temp(lhs.str);
temp+=rhs;
return temp;
}

A& A::operator =(const A&a)
{
this->str=a.str;
return *this;
}

void main()
{
A a("hello_");
A aa("world");
cout<<a+aa<<endl;
}

以上是一个类A,其只有一个数据成员为std::string类型的str,该类重载了运算符+ += = 以及<< 其中+的返回值为A型的值,现在看下主函数定义了两个A的实例a和aa,a+aa返回一个A的值,并被输出。程序没什么大问题,输出结果是:hello_world。

随后突发奇想,把主函数改成:

void main()

{
A a("hello_");
A aa("world");
a+aa=a;
} 结果编译竟然通过,也就是说返回的A值竟然可以被赋值,那么到底算不算左值呢?

然后就做了个实验:

void main()

{
int i=7;

&(i++);
} 这时报错说&需要一个左值,(i++返回的是一个值而不是引用),于是我试了一下&(a+aa)结果编译通过,也就是说a+aa的返回值是一个左值。

可是为什么呢?明明返回的就只是一个A型的值,却能够当左值用?

下面是main方法 大家看看运行后会输出啥?再跟之前的第一个main方法对比下

void main()
{
A a("hello_");
A aa("world");
A* pa = &(a+aa);
cout<<(*pa)<<endl;
} 这里的输出是:

谁能解释一下为什么输出是空呢?? 好困惑。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: