zoukankan      html  css  js  c++  java
  • 运算符重载概念及实现原理

    1、运算符重载简介
    (1)为什么引入运算符重载机制?
    C++ 中的预定义的运算符:“+、-、*、/、%、^、&、~、!、|、=、<<>>、!=、…” 只能作用在基本数据类型上面,但是有些时候希望类类型之间也可以使用这些运算符进行运算(比如说:两个复数的运算),并且这种需求是合理的。基于这种需求,C++语言引入了运算符重载这一概念。
    (2)C++运算符重载机制目的?
    扩展C++中提供的运算符的适用范围,使之能作用于类类型数据上。
    (3)对C++运算符重载机制的评价?
    运算符重载机制增强了C++语言的功能,但是同时也增加了语言自身的复杂性。

    2、运算符重载的概念
    运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多
    重的含义,使同一运算符作用于不同类型的数据时导致不同类型的
    行为。

    3、具体实现
    (1)实现的实质
    运算符重载的实质是编写以运算符作为名称的函数。这样的函数称之为运算符函数。
    (2)运算符函数的类型:

    • 运算符函数可以为全局函数。
    • 运算符函数也可以为类的成员函数。

    (3)运算符函数的特点:

    • 把含运算符的表达式转换成对运算符函数的调用。
    • 把运算符的操作数转换成运算符函数的参数。
    • 运算符被多次重载时,根据实参的类型决定调用哪个运算符函数。

    (4)两种类型运算符重载的不同之处

    • 对于全局类型的运算符函数, 重载为成员函数时,参数个数为运算符目数减一。
    • 对于类的成员函数类型的运算符函数,重载为普通函数时,参数个数为运算符目数。

    4、举例

    class Complex
    {
    public:
    	double real,imag;
    	Complex( double r = 0.0, double i= 0.0 ):real(r),imag(i)
    	{
    	}
    	Complex operator-(const Complex & c);
    };
    Complex operator+( const Complex & a, const Complex & b)
    {
    	return Complex( a.real+b.real,a.imag+b.imag); //返回一个临时对象
    }
    Complex Complex::operator-(const Complex & c)
    {
    	return Complex(real - c.real, imag - c.imag); //返回一个临时对象
    }
    int main()
    {
    	Complex a(4,4),b(1,1),c;
    	c=a+b; //等价于c=operator+(a,b);  +号触发全局类型符号函数的调用,并且将a,b作为符号函数的参数。将函数的返回值赋值给c。
    	cout<<c.real << "," << c.imag << endl;
    	cout<<(a-b).real << "," << (a-b).imag << endl;//a-b等价于a.operator-(b)。对象a- 触发对象a的成员符号函数的调用,将b作为参数传递给该符号函数。函数的返回值是一个complex对象的引用,通过该引用访问这个对象的成员变量real和imag。
    	return 0;
    }
    /*
    输出:
    5,5
    3,3
    */
    
  • 相关阅读:
    一种通用的简易缓存设计方案
    SpringCloud接入Passport中台服务的FeignClient简易集成配置
    一种基于P2P技术的高效数据传输方式
    应用多环境部署和Redis高可用
    瑞金小吃
    前(单页面)后端完全分离的OAuth2授权和分享
    Session(数据)共享的前后端分离Shiro实战
    10万Http(单机和集群Server)Subscribe的可行性实验和压测
    2018年你应该了解的前端新技术
    js常见问题总结归纳
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764281.html
Copyright © 2011-2022 走看看