C++面向对象高级编程(二)基础篇
技术在于交流、沟通,转载请注明出处并保持作品的完整性。
概要
知识点1.重载成员函数
知识点2 . return by value, return by reference
知识点3 重载非成员函数
知识点4 重载操作符
这次主要回忆一下操作符重载.
先看一段代码,后续我会介绍这么做的原由
#include <iostream>
class complex
{
public:
complex(double r = , double i = ) : re(r) ,im(i) {}
complex& operator += (const complex& r);
double real() const { return re; }
double imag() const { return im; }
void real(double r); private:
double re,im;
friend complex& __doapl (complex*, const complex&);
}; inline double
imag(const complex& x)
{
return x.imag ();
}
inline double
real(const complex& x)
{
return x.real ();
}
知识点1.重载成员函数
inline complex&
complex::operator += (const complex& r)
{
return __doapl (this, r);
}
C++的调用都是从左面开始,下面调用
complex c1(,);
complex c2(,);
c1 += c2;
例如c1 += c2 他的完整含义应该是 c1 调用了 +=这个函数 传递的参数是两个其中一个是this(c1),另一个参数就是右边的值了(c2),[在编译器里别这样写,编译会报错]
//认识成员函数都有一个this point 指向调用者
//+=的完整形式应该是这样,谁调用这个函数谁就是this
inline complex&
complex::operator+=(this,const complex& r)
{
return __dopal(this, r);
}
知识点2 . return by value, return by reference
//2.return by reference
inline complex& //引用接收 提高效率 还有一个重要的知识点 以备调用者 调用c3 += c2 += c1;
__doapl(complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths; //返回的是对象, 接收却是引用, 这是C++的一个重要知识点,传递着无需知道接收者以什么形式接收
}
为什么 用引用接收 就可以让调用者调用c3 += c2 += c1;
如果你不用引用接收那么你第一次调用即c3 += c2时返回的即将是一个临时变量,那么在次调用c1时 c3 += c2 将毫无意义
知识点3 重载非成员函数
//3. 操作符重载 非成员函数 无this
inline complex
operator + (const complex& x, const complex& y)
{
return complex (real (x) + real (y),
imag (x) + imag (y));
}
inline complex
operator + (const complex& x, double y)
{
return complex (real (x) + y, imag (x));
}
inline complex
operator + (double x, const complex& y)
{
return complex (x + real (y), imag (y));
}
临时对象:typename() 创建临时对象 为什么上面的三个返回值不是reference 因为他们返回的一定是局部变量
知识点2.是左边 = 左边+ 右边 左边是一直存在的
知识点4 重载操作符
//<< 重载 由于这个操作符不认识我们新创建的对象我们需要重载
//千万不要把这个操作符写成成员函数 必须写成全局的
std::ostream&
operator << (std::ostream& os, const complex& x) //这里的os就是cout 其实cout是一个类 别用const修饰 传引用为了能够相应连续调用
{
return os << '(' << real (x) << ','
<< imag (x) << ')';
}
总结
1.传递着无需知道接收者以什么形式接收
2.接收者(返回值)是 by value还是 by reference, by value 一般返回临时变量和将创建出的对象 , by reference 一般是在已经存在的对象上做修改
3.操作符重载不要加const ,不要声明称成员函数
如有不正确的地方请指正
参照<<侯捷 C++面向对象高级编程>>
C++面向对象高级编程(二)基础篇的更多相关文章
- C++面向对象高级编程(四)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
- C++面向对象高级编程(一)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
随机推荐
- C/C++之Qt正则表达式
引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征.比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 ...
- Linux 系统日志管理
Linux rsyslogd服务及启动方法 在 CentOS 6.x 中,日志服务已经由 rsyslogd 取代了原先的 syslogd.Red Hat 公司认为 syslogd 已经不能满足工作中的 ...
- Atom插件无法下载安装解决办法,Atom使用教程,Atom常用插件
使用教程http://wiki.jikexueyuan.com/project/atom/plug-in.html atom通过setting中无法下载插件,通过apm也无法下载插件,可能是网络.co ...
- [日志] spring boot + logback 日志输出配置
一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...
- [HNOI2019]校园旅行(构造+生成树+动规)
题目 [HNOI2019]校园旅行 做法 最朴素的做法就是点对扩展\(O(m^2)\) 发现\(n\)比较小,我们是否能从\(n\)下手减少边数呢?是肯定的 单独看一个颜色的联通块,如果是二分图,我们 ...
- Java GC垃圾回收
Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的对象实例,所以Java的堆也叫GC堆. Java在垃圾收集的过程中,主要用到了分代收集算法,具体有复制.标记清除.标记压 ...
- svn常用维护命令
公司版本管理同时用的svn和gitlab,有互补作用 这边写一写慢慢积累自己用过的svn常用维护 查看版本范围之间的变化: [root@192-168-2-82 mnt]# svn log -r 45 ...
- MySQL 删除重复记录
==========A really easy way to do this is to add a UNIQUE index on the 3 columns. When you write the ...
- 网络软中断与NAPI函数分析
网卡只有rx硬中断,外设通过中断控制器向CPU发出有数据包来临的通知, 而没有tx硬中断,因为发送数据包是cpu向外设发出的命令. ixgbe驱动的rx软中断和tx软中断在同一个CPU上处理. htt ...
- 常见ADB命令
常见ADB命令 比如说知道了push和pull操作,就可以实现一个简单的手机助手. 如果有多台设备,操作的时候要指定设备. -s加设备名称