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);
上面两行代码都是生成临时对象的方法。
相关文章推荐
- C语言宏定义技巧(常用宏定义)
- C语言优化学习——结构体定义优化
- c++开源机器学习库及机器学习知识框架(更新中)
- 【黑马程序员】C语言分支
- oc语言学习之基础知识点介绍(二):类和对象的进一步介绍
- 【黑马程序员】C语言运算符
- 一元线性回归模型与最小二乘法及其C++实现
- 【黑马程序员】C语言基础语法
- 【C++ Primer 学习笔记】: 容器和算法之【顺序容器】
- c++ list, vector, map, set 区别与用法比较
- 稀疏矩阵的实现(三元组存储)C++
- C#调用C++编写的dll
- 了解指针,分分钟的事情 C++筆記--指針
- 【c++】双向链表容器list
- 十字链表的实现C++
- C++面试问题汇总
- 二叉树的基本操作C++
- c++ swap 函数
- 【C++】广义表
- VC++ 动态检测串口的热插拔