您的位置:首页 > 编程语言 > C语言/C++

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

2015-11-17 16:21 477 查看

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);


上面两行代码都是生成临时对象的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: