问题描述
- 关于C++操作符重载的问题
-
C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2.
如果返回一个对象的引用的话,编译器会报错。因为返回的对象是局部变量,无法引用。
比如:
//此函数为List类的友元函数。
//template friend List& operator+(List& L1,List& L2);
template
List& operator+(List& L1,List& L2)
{
List list(L1);
list1+=L2;
return list;
}
求问怎么解决这个问题?
解决方案
模板类中操作符重载问题("和">>"重载)
在模板类中输入流“>>”和输出流“的重载,若使用友元在类内声明,在类外实现,那么连接时将会报错,但我们可以采用以下三种方式来实现输出流"和"输入流>>"的重载。
一、将输出流"和"输入流>>"重载的实现写在类中
#include?"stdafx.h"
#include???
using???namespace???std;??
???
......
答案就在这里:模板类操作符重载问题
----------------------
解决方案二:
那就不返回引用
C++11 可以设计 移动构造函数,移动 赋值运算符函数,辅助函数实现返回值优化
解决方案三:
你定义返回值为引用想怎样用?
一般可以这样设计加法:
List List::operator+(List L2)
{
List list;
list=this+L2;
return list;
}
解决方案四:
#include
using namespace std;
class Complex
{
private:
int x;
int y;
int z;
public:
Complex(){ x = 0; y = 0; z = 0; }
Complex(int i, int j, int k){ x = i; y = j; z = k; }
// Complex operator+(Complex &c2);
// friend Complex operator+(Complex &c1,Complex &c2);
Complex operator++();
Complex operator++(int);
int getx(){ return x; }
int gety(){ return y; }
int getz(){ return z; }
friend ostream& operator<<(ostream &, Complex&);
friend istream& operator>>(istream &, Complex&);
operator int(){ return x; }
~Complex(){ cout << "????
"; }
};/*
Complex Complex::operator+(Complex &c2)
{
Complex c;
c.x =x+c2.x;
c.y =y+c2.y;
c.z =z+c2.z;
return c;
}
Complex operator+(Complex &c1,Complex &c2)
{
Complex c;
c.x =c1.x+c2.x;
c.y =c1.y+c2.y;
c.z =c1.z+c2.z;
return c;
}*/
Complex operator+(Complex &c1, Complex &c2)
{
return Complex(c1.getx() + c2.getx(), c1.gety() + c2.gety(), c1.getz() + c2.getz());
}
Complex Complex::operator++()
{
x++;
y++;
z++;
return *this;
}
Complex Complex::operator++(int)
{
Complex c;
x++;
y++;
z++;
return c;
}
ostream& operator <<(ostream &output, Complex &c)
{
output <<"("<< c.x <<","<< c.y<<","<< c.z<<" )"<< endl;
return output;
}
istream& operator >>(istream &input, Complex &c)
{
input >> c.x >> c.y >> c.z;
return input;
}
int main()
{
int d;
Complex c1(1, 2, 3), c2(2, 2, 2), c3;
cout << "please inout six numbers:" << endl;
cin >> c1;
cout << c1<<endl;
c3 = c1 + c2;
++c1;
c1++;
d = 3 + c2;
Complex c4(c1);
cout << c1<< endl << c2 << endl;
cout << c3 << endl<<d<<endl;
cout << c4 << endl;
system("pause");
return 0;
}
解决方案五:
要么不返回引用直接复制给新的string对象,要么返回string1的引用。
解决方案六:
operator + 这个双目运算符函数,重载为 友元函数,返回对象 ,不可返回引用。
类似的 -,*。/ 都是如此
解决方案七:
那你就不要返回局部对象啊,浪费空间,