zoukankan      html  css  js  c++  java
  • C++中的运算符重载

    在C++中,函数重载有两种方式:

    • 直接在类内部声明,只需要一个参数
    	bool operator ==(const Node &node) {
    		return this->x == node.x and this->y == node.y;
    	}
    
    • 在类外部声明,需要两个参数
    bool operator<(const Node &a, const Node &b) {
        if (a.x != b.x)return a.x < b.x;
        else return a.y < b.y;
    }
    

    除了手动重载这些函数,还可以使用模板函数进行快速重载,就像C#中的扩展方法和Go里面的struct一样给class插上“翅膀”。方法是:使用utility中的rel_ops命名空间。
    这个命名空间实现了以下模板函数:

    namespace rel_ops {
      template <class T> bool operator!= (const T& x, const T& y);
      template <class T> bool operator>  (const T& x, const T& y);
      template <class T> bool operator<= (const T& x, const T& y);
      template <class T> bool operator>= (const T& x, const T& y);
    }
    

    如上所示,rel_ops命名空间实现了四种运算符,我们只需要自己实现==<两个运算符就能够实现以上四种运算符了。

    请看一个完整的例子。

    #include<iostream>
    #include<iso646.h>
    using namespace std;
    class Node {
    public:
    	int x, y;
    	Node(int x, int y) {
    		this->x = x, this->y = y;
    	}
    	bool operator ==(const Node &node) {
    		return this->x == node.x and this->y == node.y;
    	}
    };
    bool operator<(const Node &a, const Node &b) {
    	if (a.x != b.x)return a.x < b.x;
    	else return a.y < b.y;
    }
    int main() {
    	using namespace std::rel_ops;
    	Node m(3, 4), n(2, 5);
    	cout << (m > n) << endl;
    	cout << (m <= n) << endl;
    	return 0;
    }
    

    还有一个关键之处:左移运算符和移位运算符都是<<,但是因为它们接受的参数不一样,所以可以同时重载。

    #include <iostream>
    using namespace::std;
    class MyClass
    {
    public:
    	MyClass(int a, int b)
    	{
    		this->a = a;
    		this->b = b;
    	}
    	void print_Myclass() {
    		cout << this->a << '+' << b << 'i' << endl;
    	}
    	//输出运算符和左移运算符虽然样子一样,但是参数不一样,所以相当于运算符重载
    	friend ostream & operator<<(ostream &os, MyClass &c);
    	MyClass operator<<(int cnt) {
    		return MyClass(a << cnt, b << cnt);
    	}
    private:
    	int a;
    	int b;
    };
    
    //使用友元访问私有变量
    ostream & operator<<(ostream &os, MyClass &c) {
    	os << c.a << '+' << c.b << 'i';
    	return os;
    }
    void main() {
    	MyClass c(3, 4);
    	cout << c << endl;
    	MyClass	cc = c << 1;
    	cout << cc << endl;
    	//下面这句话会报错,因为cc<<1返回来的对象是一个临时对象,而cout<<需要的参数却是MyClass&类型的对象
    	//cout << (cc << 1) << endl;
    }
    

    虽然移位运算符正常情况下接受的参数是int,表示移位的个数,但实际上这个参数可以是任何类型,移位运算符完全由用户掌控,但是有两点需要注意:

    • 运算符的参数个数必须一致
    • 重载运算符后的优先级和结合性都不会改变。
    	MyClass operator<<(double cnt) {
    		return MyClass(a * cnt, b *cnt);
    	}
    

    C++中可以重载的运算符包括

    +	-	*	/	%	^	&	|	~
    
    !	=	<	>	+=	-=	*=	/=	%
    
    ^=	&=	|=	<<	>>	>>=	<<=	==	!=
    
    <=	>=	&&	||	++	--	->*	‘	->
    
    []	()	new	delete	new[]	delete[]
    

    不能重载的操作符是类属关系运算符 如:

    .	::	 .*	?:	sizeof
    
  • 相关阅读:
    HTML页面下echarts图形绘制
    nth-child的运用
    黑客零做起
    回溯法-背包问题
    回溯法-迷宫问题
    ECMA概述
    微信小程序-蓝牙
    JavaScript实现千位分隔符
    Vue 就地复用策略
    内联函数inline
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/9774817.html
Copyright © 2011-2022 走看看