C++面向对象高级开发_极客班_第一节课笔记_section3

5 操作符重载与临时对象

5.1 操作符重载的概念

在C语言中是没有操作符重载的概念的。C语言的操作都是通过函数来实现的。C++是少数几个可以提供操作符重载相关的语言。C++对操作符的重载,不仅让操作符的功能更多样化,也丰富了C++的使用。操作符重载,本质上就是函数

操作符重载分为成员函数重载 和 非成员函数重载

class A
A c1, c2;
c1 += c2   // (3)

对于操作符“+=”,编译器看待第3行的时候,会将操作符+=作用在左数身上,然后就会寻找,左边的是否对这个符号有定义,如果有的话,编译器就把第3行编译然后就会调用这个函数,如果没有的话,就会发生编译错误。

5.2 this 概念

类的所有成员函数的参数一定都含有一个隐藏参数,this

// 友元函数
inline complex& _doapl(complex* ths, const complex& r)   // 1
{
    ths.re += r.re;
    ths.im += r.im;
    return *ths;                                       //   5
}

//成员函数重载
inline complex& complex::operator+=(const complex& r)
{
    return _doapl(this, r);
}

this 的概念,就是谁调用这个函数,“谁”就是this,this为使用者的地址。this不可在参数列写出来,但是可以再函数内部使用。

在友元函数这个代码中,return *ths; 接收是 complex& , 这两个是不冲突的。因为ths是指针 , *ths 是指针指向的那个对象。 接收是 complex& ,是一个引用。这是非常好的一个做法,因为他让传递者无需知道接受者使用的是引用。传递者也可以认为接受者接收的是value,这样就方便了传递者。试想,如果接受者需要传的是指针,那么传递者最后传返回值的时候,就要思考传递指针。这样的做法没有引用方便。

5.3 操作符重载返回值

inline complex& complex::operator+=(const complex& r)
{
    return _doapl(this, r);
}


c1 += c2;                                // 1
c1 += c2 += c3;                          // 2   

操作符重载的返回值一般都是complex&,是有值的。这主要是为了方便 2的调用。因为很多C程序员是习惯使用连等号的,通过返回引用来使得连等能够实现。

5.4class 外的全局函数

#ifndef _COMPLEX_
define  _COMPLEX_
class complex{

///body

};

complex::function(){} // 本体外定义的成员函数
//除了成员函数,其他都是全局函数或者说是全域函数   

inline double real(const complex& r) 
{
    return r.real();
}

inline double imag(const complex& r) 
{
    return r.imag();
}

end if



{
    complex c1(2,1);
    cout << imag(c1);
    cout << real(c1);
}

5.5 操作符重载非成员函数写法

inline complex operator + (const double& x, const complex& r)
{
    return complex(x+real(r), imag(r));
}

inline complex operator + (const complex& x, const complex& y)
{
    return complex(real(x) + real(y), imag(x) + imag(y));
}

inline opeartor - (const complex& r) // 取反
{
    return complex(-real(r), -imag(r));
}

inline conj (const complex& r) //共轭
{
    return complex(real(r), -imag(r));
}

这里由于是“+”,中间有一个local var , 因此返回值是value , 接收者就是value。
对于编译器而言,一旦发现操作符重载,就会去寻找设计者有没有设计操作符重载相关的定义,这个定义可能在成员函数里,也有可能在非成员函数里,但是二者不能冲突。

5.6 temp object 临时对象 typename();

typename();    // 创建临时对象的语法

在5.5中运用到了,创建临时对象的语法。这个在标准库里面很常用。作用范围(生命区域)只有这一行,到下一行就自动释放了。因此,可以认为这是一个很好的生成临时变量的方法。因为,生成临时对象时不需要建立名字。而是直接生成。

complex(5,6);  
int(5);

上面两行代码都是生成临时对象的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值