c++-关于C++操作符重载的问题

问题描述

关于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 + 这个双目运算符函数,重载为 友元函数,返回对象 ,不可返回引用。
类似的 -,*。/ 都是如此

解决方案七:

那你就不要返回局部对象啊,浪费空间,

时间: 2024-12-31 14:23:25

c++-关于C++操作符重载的问题的相关文章

C#锐利体验之第八讲 索引器与操作符重载

索引 索引器 索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用.索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.下面是典型的索引器的设计,我们在这里忽略了具体的实现. class MyClass{    public object this [int index]    {        get        {            // 取数据        }        set  

C#中奇妙的操作符重载

C#中奇妙的操作符重载 细心的朋友可能发现,C#虽然可以重载操作符,但和C++比较起来,却有很大的不同.定义的时候重载操作符方法必须是static,而且至少有一个参数(一目和二目分别是一个和两个),C#和C++比起来,最重要的特征是:<.>:==.!=:true.false必须成对出现,即重载了"<"就必须重载">",重载了"=="就必须重载"!=",重载了"true"就必须重载&q

C++的操作符重载概述

1.什么是操作符重载 可以使用分词将操作符重载理解为:操作符+重载. C++中的操作符很多,如+,-,*,\等等. C++中的重载也是C++中面向对象多态的体现. 简单说操作符重载: C++中有:int a=2+3; 那么a=5 操作符重载可以实现对自定义类型的操作: #include <iostream> using namespace std; class Point{ public: int x; int y; Point(int _x,int _y):x(_x),y(_y){ } Po

C#操作符重载

11.5.1 问题的提出 在面向对象的程序设计中,自己定义一个类,就等于创建了一个新类型.类的实例和变量一样,可以作为参数传递,也可以作为返回类型. 在第七章中,我们介绍了系统定义的许多操作符.比如对于两个整型变量,使用算术操作符可以简便地进行算术运算: class A { public int x; public int y; public int Plus{ return x+y; } } 再比如,我们希望将属于不同类的两个实例的数据内容相加: class B { public int x;

【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化     全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this-&g

c++ 操作符重载-关于操作符重载的问题

问题描述 关于操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个引用的话,编译器会报错.因为返回的类是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2) { Lis

运算符重载-C++ 操作符重载的内存释放问题

问题描述 C++ 操作符重载的内存释放问题 =操作符重载,给复构造函数进行赋值时的代码如下: MyString & MyString::operator =(const MyString &str) { if(this == &str) return *this; delete []m_pData; //**???????????????????????????? ** m_pData = NULL; m_pData = new char(strlen(str.m_pData) +

C++中操作符重载的const与默认构造函数

问题描述 C++中操作符重载的const与默认构造函数 原代码 class TestOverloadLessThan { public: TestOverloadLessThan( int m ) : m_int(m){}; int getInt(){ return m_int;}; bool operator<( const TestOverloadLessThan& t) const { return ( this->getInt() < t.getInt() ); }; p

碰到了一个短语c++操作符重载的问题

问题描述 碰到了一个短语c++操作符重载的问题 我在这个程序中重载>>操作符,报出了如下错误: Error 1 error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion) Error 2 3 IntelliSense: no operator ">&g