C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,
一、需要解决的问题
下面的复数解决方案是否可行?
下面看一下复数的加法操作:
#include <stdio.h>
class Complex 
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    friend Complex Add(const Complex& p1, const Complex& p2);
};
Complex Add(const Complex& p1, const Complex& p2)
{
    Complex ret;
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = Add(c1, c2); // c1 + c2
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}输出结果如下:
思考
Add 函数可以解决 Complex 对象相加的问题,但是 Complex 是现实世界中确实存在的复数,并且复数在数学中的地位和普通的实数相同。
为什么不能让+操作符也支持复数相加呢?这个就涉及到操作符的重载。
二、操作符重载
C++ 中的重载能够扩展操作符的功能
操作符的重载以函数的方式进行
本质
用特殊形式的函数扩展操作符的功能
- 通过 operator 关键字可以定义特殊的函数
 - operator 的本质是通过函数重载操作符
 
语法
下面来初探一下操作符重载:
#include <stdio.h>
class Complex 
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    friend Complex operator + (const Complex& p1, const Complex& p2);
};
Complex operator + (const Complex& p1, const Complex& p2)
{
    Complex ret;
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // operator + (c1, c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}输出结果如下:
可以将操作符重载函数定义为类的成员函数
- 比全局操作符重载函数少—个参数(左操作数)
 - 不需要依赖友元就可以完成操作符重载
 - 编译器优先在成员函数中寻找操作符重载函数
 
下面来实现在成员函数中重载操作符:
#include <stdio.h>
class Complex 
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    Complex operator + (const Complex& p)
    {
        Complex ret;
        printf("Complex operator + (const Complex& p)\n");
        ret.a = this->a + p.a;
        ret.b = this->b + p.b;
        return ret;
    }
    friend Complex operator + (const Complex& p1, const Complex& p2);
};
Complex operator + (const Complex& p1, const Complex& p2)
{
    Complex ret;
    printf("Complex operator + (const Complex& p1, const Complex& p2)\n");
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // c1.operator + (c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}输出结果如下:
这个说明编译器优先在成员函数中寻找操作符重载函数
故上述代码可以直接写成:
#include <stdio.h>
class Complex 
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    Complex operator + (const Complex& p)
    {
        Complex ret;
        ret.a = this->a + p.a;
        ret.b = this->b + p.b;
        return ret;
    }
};
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // c1.operator + (c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}三、小结
- 操作符重载是 C++ 的强大特性之一
 - 操作符重载的本质是通过函数扩展操作符的功能
 - operator 关键字是实现操作符重载的关键
 - 操作符重载遵循相同的函数重载规则
 - 全局函数和成员函数都可以实现对操作符的重载
 
到此这篇关于C++超详细讲解操作符的重载的文章就介绍到这了,更多相关C++操作符重载内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
				 沃梦达教程
				
			本文标题为:C++超详细讲解操作符的重载
				
        
 
            
        
             猜你喜欢
        
	     - C语言手把手带你掌握带头双向循环链表 2023-04-03
 - 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
 - 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
 - c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
 - C++ 数据结构超详细讲解顺序表 2023-03-25
 - C语言qsort()函数的使用方法详解 2023-04-26
 - ubuntu下C/C++获取剩余内存 2023-09-18
 - Qt计时器使用方法详解 2023-05-30
 - Easyx实现扫雷游戏 2023-02-06
 - C语言详解float类型在内存中的存储方式 2023-03-27
 
						
						
						
						
						
				
				
				
				