运算符重载 学习笔记

运算符重载:
赋予(扩展)运算符其他功能


person& person::operator+ (const person &other)
{
    person tmp;
    tmp.x = this->x + other.x;
    tmp.y = this->y + other.y;

    return tmp;
}
  • 运算符重载和函数重载类似
  • 重载函数本质上就是多个独立函数,重载机制在编译时发生,运行时不参与
  • 函数重载的意义就是避免程序员自己不按规范命名,方便编写类库覆盖所有可能操作,是一种语法糖
person p1(1,3);
person p2(5,3);

p3 = p1+p2; //运算符重载后使用
p3 = p1.operator +(p2);//另一种写法
  • 两种使用方法没有本质区别,只是格式不同
  • p3 = p1.operator +(p2);更像调用函数
  • p3 = p1+p2; 更符合数学逻辑

理解运算符重载的关键:
确定函数重载函数的返回值,传入参数,this指针指向的对象即可理解该函数作用。

运算符重载的细节:

=运算符在c++中有默认的运算符重载函数
=运算符重载函数和拷贝构造函数

  • 初始化时的赋值调用的是拷贝构造函数
  • 非初始化时赋值调用的是=运算符重载函数

(=)赋值运算符重载函数参数中的const
(1)如果运算符对其右侧的操作数并不改变,则应该在参数列表中使用const引用
(2)C++的const要求非常严格,=运算符重载函数的形参一定加const

避免赋值运算符中的自赋值
(1)自赋值就是Person a; a = a;
(2)自赋值如果不处理,轻则浪费效率,重则导致内存丢失(该深拷贝时做了浅拷贝)
(3)避免自赋值只需要在赋值运算符重载函数所有操作前加上一个判断 if (this != &other)即可

person&  person::operator= (const person &other)
{
    if(this != &other)
    {
    this->x = other.x;
    this->y = other.y;
    }

    return *this;
}

运算符重载函数返回引用:
1)赋值运算符重载函数可以返回对象类型,也可以返回引用类型
2)返回引用可以避免一次返回值传递的对象复制
3)cpp不强制要求返回引用,但好的代码一般都这么用
4)返回引用支持连续赋值

传参时传引用:
1)如果传对象,调用时是值传递,调用时复制一次,额外开销
2)如果传指针,也可以工作,使用时为了符合参数格式要写成a=&b;写法不符合习惯
3)引用的发明就是因为运算符重载传参的尴尬

参数传引用,返回类型也是引用 是运算符重载函数最标准的写法

重载运算符的两种方法:

  1. 使重载运算符成为该类的成员函数。这允许运算符函数访问类的私有成员。它也允许函数使用隐式的this指针形参来访问调用对象。

  2. 使重载的成员函数成为独立的函数。当以这种方式重载时,运算符函数必须 声明为类的友元才能访问类的私有成员。这两种方式效率没有区别

  3. 某些运算符(<< 和>>)必须作为独立函数重载,大部分运算符两种都可以

  4. 对于二元运算符(两个操作数)重载为独立函数更符合逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值