zoukankan      html  css  js  c++  java
  • 操作符重载的概念

    请看程序:
     1 #include <stdio.h>
     2 class Complex
     3 {
     4     int a;
     5     int b;
     6 public:
     7     Complex(int a,int b)
     8     {
     9         this->a = a;
    10         this->b = b
    11     }
    12     friend Complex Add(const Complex&p1,const Complex&p2);
    13 };
    14 Complex Add(const Complex&p1,const Complex&p2)
    15 {
    16     Complex ret;
    17     ret.a = p1.a + p2.a;
    18     ret.b = p1.b + p2.b;
    19     
    20     return ret;
    21 }
    22 int main()
    23 {
    24     Complex c1(1,2);
    25     Complex c2(3,4);
    26     Complex c3 = Add(c1,c2);
    27     printf("c3.a = %d,c3.b = %d
    ",c3.a,c3.b);
    28     return 0;
    29 }
    思考一个问题,在以上程序中,Add函数可以解决Complex对象相加的问题,但是Complex是现实世界中确实存在的复数,并且复数在数学中的地位和普通的实数相同,那为什么不能让 + 操作符也支持复数相加呢??
    知识点:
    • C++中的重载能够扩展操作符的功能
    • 操作符的重载以函数的方式进行
    • 本质:用特殊形式的函数扩展操作符的功能
    • 通过operator关键字可以定义特殊的函数
    • operator的本质是通过函数重载操作符

    操作符重载语法:

    1 Type operator Sign(const Type p1,const Type p2)
    2 {
    3     Type ret;
    4     return ret;
    5 }

    Sign为系统中预定义的操作符,如+ ,-, *, /,等

     1 #include <stdio.h>
     2 class Complex
     3 {
     4     int a;
     5     int b;
     6 public:
     7     Complex(int a = 0,int b = 0)
     8     {
     9         this->a = a;
    10         this->b = b;
    11     }
    12     int getA()
    13     {
    14         return a;
    15     }
    16     int getB()
    17     {
    18         return b;
    19     }
    20     friend Complex operator + (const Complex& p1,const Complex& p2);
    21 };
    22 Complex operator + (const Complex& p1,const Complex& p2)
    23 {
    24     Complex ret;
    25     ret.a = p1.a + p2.a;
    26     ret.b = p1.b + p2.b;
    27     return ret;
    28 }
    29 int main()
    30 {
    31     Complex c1(1,2);
    32     Complex c2(3,4);
    33     Complex c3 = c1 + c2;
    34     printf("c3.a = %d,c3.b = %d
    ",c3.getA(),c3.getB());
    35     return 0;
    36 }
    37  
    • 可以将操作符重载函数定义为类的成员函数
    1. 比全局操作符重载函数少一个参数(左操作数)
    2. 不需要依赖友元就可以完成操作符重载
    3. 编译器优先在成员函数中寻找操作符重载函数
       
     1 class Type
     2 {
     3 public:
     4     Type operator Sign(const Type&p)
     5     {
     6         Type ret;
     7         return ret;
     8     }
     9};
    10 #include <stdio.h>
    11 class Complex
    12 {
    13     int a;
    14     int b;
    15 public:
    16     Complex(int a = 0,int b = 0)
    17     {
    18         this->a = a;
    19         this->b = b;
    20     }
    21     int getA()
    22     {
    23         return a;
    24     }
    25     int getB()
    26     {
    27         return b;
    28     }
    29     Complex operator + (const Complex& p)
    30     {
    31         Complex ret;
    32         ret.a = this->a + p.a;
    33         ret.b = this->b + p.b;
    34         return ret;
    35     }
    36 };
    37 int main()
    38 {
    39     Complex c1(1,2);
    40     Complex c2(3,4);
    41     Complex c3 = c1 + c2;//c1.operator + (c2)
    42     printf("c3.a = %d,c3.b = %d
    ",c3.getA(),c3.getB());
    43     return 0;
    44 }
    小结:
    1. 操作符重载是C++的强大特性之一
    2. 操作符重载的本质是通过函数扩展操作符的功能
    3. opeartor关键字是实现操作符重载的关键
    4. 操作符重载遵循相同的函数重载规则
    5. 全局函数和成员函数都可以实现对操作符的重载
    主要记录的是学习听课的笔记
  • 相关阅读:
    Linux 学习 step by step (1)
    ubuntu server nginx 安装与配置
    ubuntu server samba服务器配置
    iOS app集成支付宝支付流程及后台php订单签名处理
    mac 连接windows 共享内容
    linux 文件查找,which,whereis,locate,find
    ubuntu server vsftpd 虚拟用户及目录
    ubuntu server 安装 mantis bug tracker 中文配置
    ubuntu server vsftpd 匿名用户上传下载及目录设置
    linux 用户管理,用户权限管理,用户组管理
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12176201.html
Copyright © 2011-2022 走看看