大家好,欢迎来到IT知识分享网。
在C++的概念中,操作符实际上是一种特殊的函数,因此函数的重载对于操作符同样适用
操作符重载的语法:
类 operator操作符名(参数){}
一、类的成员函数的重载
1.类中双目运算符的成员函数的重载
在类的成员运算符函数重载中,由于默认已经传入一个隐含参数this,因此只需要再传入一个对象即可。
#include<iostream> using namespace std; class Number { public: Number(int a, int b); Number operator+(Number& n);//双目运算符只需要传递一个参数(隐含了一个本类的this指针) void in() cout << this->a << endl; cout << this->b << endl; } private: int a, b; }; Number::Number(int a, int b) { this->a = a; this->b = b; } Number Number::operator+(Number& n) { this->a = this->a + n.a; this->b = this->b + n.b; return *this; } int main() { Number a(1, 2); Number b(1, 2); Number c(2, 2); //c = a.operator+(b); c = a + b; c.in(); return 0; }//c=a.operator+(b)与c=a+b同等效果
注意:对于双目运算符而言,a.operator+(b)=a+b;
2.类中单目运算符的成员函数的重载
由于单目运算符可能存在前置运算和后置运算两种,因此为了区分前置单目运算符,我们再后置单目运算符的申明中引入虚拟参数int用以区别(仅仅是用来区分,并没有任何实际作用)
2.1前置单目运算符重载
由于同样是在类中,因此单目运算实现对对象本身的操作,不用引入其他参数
class Number { public: Number(int a = 0, int b = 0); Number& operator++(); void in() { cout << this->a << endl; cout << this->b << endl; } private: int a, b; }; Number& Number::operator++() { this->a = this->a + 1; this->b = this->b + 1; return *this; } Number::Number(int a, int b) { this->a = a; this->b = b; } int main() { Number a(1, 2); Number b(1, 2); Number c; //c = a.operator+(b); //++c; c++; cout << c; return 0; }
注意:前置++的语句为 Number& Number::operator++()
{}此处返回类型为类对象的引用,原因是当需要进行连续操作时通常需要返回引用
2.2后置单目运算符重载
由于需要区分前置运算符,后置运算符的重载函数申明时,需要传入一个int虚拟参数,用以区分
class Number { public: Number(int a = 0, int b = 0); Number operator++(int);//虚拟参数int,用来区分前置++的重载 void in() { cout << this->a << endl; cout << this->b << endl; } private: int a, b; }; Number Number::operator++(int) { return *this; } Number::Number(int a, int b) { this->a = a; this->b = b; } int main() { Number a(1, 2); Number b(1, 2); Number c; //c = a.operator+(b); //++c; c++; cout << c; return 0; }
二、类外普通函数的重载
1.普通函数的双目运算符重载
普通函数的重载和成员函数的重载差异在于,普通函数运算符重载需要多传递一个参数为运算符函数的发起对象(即this的功能)
注意:若需要调用传入的类对象的私有成员成员数据,则需要在对应的类中申明该函数为友元函数。
class Number { public: Number(int a = 0, int b = 0); void in() { cout << this->a << endl; cout << this->b << endl; } private: friend Number operator+(Number& x, Number& c);//传入两个对象,实现双目运算的功能 friend Number operator++(Number& x, int); int a, b; }; Number operator+(Number& x, Number& c) { x.a = x.a + c.a; x.b = x.b + c.b; return x; } ostream& operator<< (ostream&, Number& x) { x.in(); return cout; } Number::Number(int a, int b) { this->a = a; this->b = b; } int main() { Number a(1, 2); Number b(1, 2); Number c; //c = a.operator+(b); //++c; c++; cout << c; return 0; }
2.普通函数的单目运算符重载
2.1前置运算符的单目运算符重载
函数外的函数体:
Number& operator++(Number& x){};
类中申明友元(既可以在共有处申明,也可以在私有处申明)
public:
friend Number& operator++(Number& x);
2.2后置运算符的单目运算符重载
函数外的函数体:
Number& operator++(Number& x,int){};
类中申明友元(既可以在共有处申明,也可以在私有处申明)
public:
friend Number& operator++(Number& x,int);
3.输入输出运算符的重载
对于输入输出运算符的重载必须用全局的函数实现。如果用类中的成员函数实现输出或输入,如下:
但是我们需要的是:
因此我们传入ostream类,和其他类,通过ostream的对象cout调用<<运算符实现对其他类对象的输出
class Number { private: int a,b; public: Number(int x, int y) { a = x; b = y; } friend ostream& operator<<(ostream&, Number& x); }; ostream& operator<<(ostream&, Number& x) { cout << x.a << endl; cout << x.b << endl; }
注意:由于需要访问传入的Number类的私有成员,因此设置友元函数
4.=运算符的函数重载
=运算符只能作为成员函数重载(=、[]、()、->等所有类型转换运算符只能作为成员函数重载)
class Number { private: int a,b; public: Number(int x, int y) { a = x; b = y; } Number& operator=(Number&x); }; Number& Number::operator=(Number& x) { this->a = x.a; this->b = x.b; }
注意:=运算符重载常常涉及深浅拷贝的问题,当类的私有成员数据为指针地址时,=需要对类对象进行深拷贝(即重新开辟空间)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/31139.html