关闭

第30课 操作符重载的概念

308人阅读 评论(0) 收藏 举报
分类:

1、操作符重载

    1.1、C++中的重载能够扩展操作符的功能
    1.2、操作符的重载以函数的方式进行,本质上是用特殊形式的函数扩展操作符的功能
    1.3、通过operator关键字可以定义特殊函数,operator的本质是通过函数来重载操作符
    1.4、语法:Type operator Sign(const Type& p1, const Type& p2);//Sign如+、-、*等
/****************      操作符重载初探     *************/
#include <stdio.h>
class Complex
{
private:
    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;
    }
    。const对象的引用,只能调用const成员函数,不能修改对象中的变量。
    //方式一: 通过全局普通的函数实现复数相加 ,,为了在外部访问类中私有成员,用友元声明。
    friend Complex Add(const Complex& p1, const Complex& p2);//这个函数是这个类的友元函数
    
    //方式二:通过全局函数重载“+”操作符实现复数相加,
    friend Complex operator + (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;
}
//全局重载操作符 +   ,,重载的实质就是为了扩展函数功能
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 = Add(c1, c2);   //函数实现复数的计算,缺点:无法写成c1 + c2的形式。
    //方式二的调用
    //Complex c3 = operator+(c1, c2); //把“opertor”当成函数名一样的调用。
    
    Complex c3 = c1 + c2;   //更加直观,但是本质上还是调用"operator+"这个函数。
    
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    
    return 0;
}

2、可将操作符重载函数定义为类的成员函数

    2.1、比全局操作符重载函数少一个参数左操作数
    2.2、不需要依赖友元就可以完成操作符重载
    2.3、编译器优先成员函数中寻找操作符重载函数

/****************      成员函数重载操作符     *************/
#include <stdio.h>
class Complex
{
private:
    int a;
    int b;
    
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;//普通函数是具有this参数的,静态函数没有。初始化每个对象的成员变量。
        this->b = b;
    }
    
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    
    //方式一: 通过全局普通的函数实现复数相加 ,,为了在外部访问类中私有成员,用友元声明。
    friend Complex Add(const Complex& p1, const Complex& p2);//这个函数是这个类的友元函数
    
    //方式二:通过全局函数重载“+”操作符实现复数相加,
    friend Complex operator + (const Complex& p1, const Complex& p2);   
    //方式三:通过成员函数实现 “+” 操作符的重载
    Complex operator+(const Complex& p) //参数少了一个左操作数!因为普通成员函数有this指针关键字。
    {
        Complex ret;    //将返回值复制给临时对象。
        ret.a = this->a + p.a;      //this ->a 是对象里面的数据。
        ret.b = this->b + p.b;
        
        return ret;
    }
};
//全局普通函数
Complex Add(const Complex& p1, const Complex& p2)
{
    Complex ret;
    ret.a = p1.a + p2.a;    //因为是友元函数,所以可以直接访问
    ret.b = p1.b + p2.b;
    
    return ret;
}
//全局重载操作符 +   ,,重载的实质就是为了扩展函数功能
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 = Add(c1, c2);   //函数实现复数的计算,缺点:无法写成c1 + c2的形式。
    //方式二的调用
    //Complex c3 = operator+(c1, c2); //把“opertor”当成函数名一样的调用。
    
    //Complex c3 = c1 + c2;   //更加直观,但是本质上还是调用"operator+"这个函数。
    
    //方式三的调用
    Complex c3 = c1.operator+(c2);  //把“operator + ”当成函数名一样的调用,c1对象的函数。
    //Complex c3 = c1 + c2;   //优先选择成员函数,而不是全局的opertor+ 函数。
    
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    
    return 0;
}

3、小结

    (1)操作符重载是C++的强大特性之一,其本质是通过函数扩展操作符的功能
    (2)operator关键字是实现操作符重载的关键
    (3)操作符重载遵循相同的函数重载规则
    (4)全局函数成员函数都可以实现对操作符的重载,但编译器优先选择通过成员函数实现的操作符重载函数
    

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

操作系统概念 第九版 Operating System Concepts, 9th Edition 中文译稿(不定时更新)

前文: 本译稿不定时更新,翻译自Operating System Concepts, 9th Edition. 欢迎您的阅读,欢迎随时交流,仅供学习,请勿用作商业用途. 自行翻译的,水平不够存在错漏在...
  • advanced_delighted
  • advanced_delighted
  • 2016-03-06 15:20
  • 3491

让你了解操作系统基本概念

前言:本文是《操作系统教程(陈怀临注释)》的读书笔记,陈首席是在原书pdf 图片上注解,字体比较模糊,故我把注释中觉得比较重要的片段摘录下来。读完此文可以让非技术人员对操作系统有框架性的认识,也可以唤...
  • fanpeihua123
  • fanpeihua123
  • 2016-05-17 15:04
  • 6350

数据挖掘概念与技术(原书第三版)范明 孟小峰译-----第六章课后习题答案

第六章答案第六章答案该答案为重庆大学计算机学院Jack Channy所作,由于本人水平有限,难免有错误和不当之处,如有意见请评论或者发邮件至majiecqu@126.com。 6.1 假设有数据集D...
  • u013272948
  • u013272948
  • 2017-06-06 22:28
  • 1399

第三十课:操作符重载的概念----------狄泰软件学院

解决复数相加的问题: 一、定义一个全局的函数,参数为对象的引用,通过函数调用的方法来解决#includeusing namespace std;class Complex { private: ...
  • LGC_LG
  • LGC_LG
  • 2017-01-30 16:59
  • 380

c++操作符重载(部分概念解释)

这里主要讲了c++操作符重载重编译器对成员函数和全局函数的不同解释,并且介绍了输入输出操作符的重载 单目操作符--------成员函数: 这个 单目操作符--------全局函数: 双目操...
  • qq_16112417
  • qq_16112417
  • 2016-01-21 11:23
  • 193

C++ 操作符重载

  • 2013-05-30 01:47
  • 1KB
  • 下载

带模板操作符重载出现的LINK错误修改方法

  • 2017-08-08 09:24
  • 28KB
  • 下载

c++课件(5)操作符重载1

  • 2017-07-29 14:02
  • 553KB
  • 下载

操作符重载

  • 2012-11-01 13:02
  • 756B
  • 下载

快速排序算法测试,操作符重载,模板应用

  • 2014-08-13 16:57
  • 7KB
  • 下载
    个人资料
    • 访问:796次
    • 积分:141
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    个人联系方式
    如有与博客有关的问题请联系博主:QQ:619418777 或者 微信:l619418777 GitHub:
    座右铭:
      你不努力,谁也给不了你想要的生活
      生活不易:谨以此献给正在努力生活的你 ^_^
    文章存档