C++ 面向对象高级设计
inline关键字
- 类声明内定义的函数,自动成为
inline
函数,类声明外定义的函数,需要加上inline
关键字才能成为inline
函数
构造函数
应该使用列表初始化
class complex {
public:
complex(double r = 0, double i = 0) : re(r), im(i){} //列表初始化
private:
double re, im;
};
class complex {
public:
complex(double r = 0, double i = 0){ re = r; im = i; } //赋值构造函数
private:
double re, im;
};
列表初始化更快,是理想的初始化方式。
常量成员函数
如果函数内不改变成员函数的值,则可以加上const修饰,更加的保险。
class complex {
public:
...
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;
};
- 常量对象只能调用常量函数,上述成员函数如果不加const, 那complex类型的常量对象则不能调用。
参数的值传递和引用传递
应尽量使用参数的引用传递,避免了参数的复制且提高了效率。
返回值的值传递和引用传递
如果返回值是一个临时对象,那应该使用值传递,因为,一旦离开函数体,内部的临时对象就没了,相反,如果传回的对象是传入的对象的话,就使用引用传递,
ostream对象
对于重载的ostream
对象,一般返回值的参数是ostream&, 不是void&, 因为我们输出的形式一般是cout<<t1<<t2, 连续输出, 返回ostream& 对象,可以继续输出。
友元
友元函数不属于对象函数,所以不受public,private,protected的限制, 但可以随意访问类内的所有成员和函数。
同一个类内的各个对象互为友元,所以在类定义中可以随意访问其他对象的私有成员, 如下:
class complex {
public:
....
int func(const complex& parm) {
return parm.re + parm.im;
}
private:
double re, im;
};
complex c1, c2;
c1.func(c2);
操作符重载
有两种方式实现操作符的重载:1. 在类内声明public类型的函数实现成员函数重载。2. 在类外声明全局函数重载。
类内声明的操作符重载 +=
在类内声明的操作符重载一般是作用在左操作数上的, 例如:
class complex {
public:
.....
friend complex& __dopal(complex*, const complex&);
complex& operator += (const complex& parm) {
return __dopal(this, parm);
}
private:
double re, im;
};
inline complex& __dopal(complex* ths, const complex& r) {
ths->re += r.re;
ths->im += r.im;
return *ths;
}
complex c1(1, 2);
c1 += 1; //重载 +=
对于类内重载的函数,其内隐含着一个this指针,可以像下面这样理解。
complex& operator += (complex* this, const complex& parm) {
return __dopal(this, parm);
}
- 注意重载的操作符 += 其返回的参数类型为complex&, 是因为可能不止一个两个对象相加,可能多个连加: c1 += c2 += c3;
- 注意不会改动的值或者对象尽量加 const 修饰。
在类外声明的操作符重载 +
类外声明的操作符重载,参数不局限于作用在左操作数,考虑左右操作数的不同形式,所以使用类外重载操作符。
complex c1(2,1);
complex c2;
c2 = c1 + c2; // 用法1: complex + complex
c2 = c1 + 5; // 用法2: complex + double
c2 = 7 + c1; // 用法3: double + complex
在类外声明函数重载 <<
与重载+的考虑方法类似,<<
操作符通常的使用方式是cout<<c1
而非c1<<cout
,因此不能使用成员函数重载<<
运算符.
考虑到形如cout<<c1<<c2<<c3
的级联用法,重载函数的返回值为ostream&而非void.
C++ 面向对象高级设计的更多相关文章
- 简学Python第七章__class面向对象高级用法与反射
Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群 群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...
- oo面向对象--规格化设计
oo面向对象--规格化设计 规格化设计与抽象 要了解规格化设计首先要了解抽象化的程序设计,两者是密不可分的. 抽象化(Abstraction) 抽象化是将数据与程序,用语义呈现他们的外观,但是隐藏起它 ...
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)
上节课复习:1.编程思想 面向过程 核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...
- Java第五次作业--面向对象高级特性(抽象类与接口)
Java第五次作业--面向对象高级特性(抽象类与接口) (一)学习总结 1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结. 2.汽车租赁公司,出租汽车 ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- Python第七章-面向对象高级
面向对象高级 一. 特性 特性是指的property. property这个词的翻译一直都有问题, 很多人把它翻译为属性, 其实是不恰当和不准确的. 在这里翻译成特性是为了和属性区别开来. 属性是指的 ...
- python高级之面向对象高级
python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...
随机推荐
- Android 7.0 TextView点击事件无效修复方案
public class PostTextView extends TextView { private Handler handler = new Handler(Looper.getMainLoo ...
- GetQueuedCompletionStatus客户端前端和server之间的通信
项目中遇到了这个东西,怎么都调试不到.记录下. 一.完成端口IOCP https://www.cnblogs.com/yuanchenhui/p/iocp_windows.html
- STM32学习笔记——序言
写AVR已经两年了.如果初中时候玩Arduino也算的话,就是6年. 两年以来,我用AVR单片机完成了两个大项目: AVR单片机教程,一时兴起写的,效果不好: MEDS,参赛用的课题,半完成,比赛都结 ...
- 基于CameraLink的逻辑综合和版图设计
前期接口设计用的是Vivado18.3+Modelsim10.6,逻辑综合及版图生成的环境是Ubuntu16,逻辑综合用的工具Design Compiler,生成版图用的工具是Encounter. 下 ...
- 【转载】关于grad_tensors的解惑
转载:https://www.cnblogs.com/marsggbo/p/11549631.html 平常都是无脑使用backward,每次看到别人的代码里使用诸如autograd.grad这种方法 ...
- ASP.NET Core扩展库
亲爱的.Neter们,在我们日复一日的编码过程中是不是会遇到一些让人烦恼的事情: 日志配置太过复杂,各种模板.参数也搞不清楚,每次都要去查看日志库的文档,还需要复制粘贴一些重复代码,好无赖 当需要类型 ...
- CVE-2017-12615 -Tomcat-任意写入文件
漏洞分析参考 https://www.freebuf.com/vuls/148283.html 漏洞描述: 当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 ...
- C#开发BIMFACE系列37 网页集成开发1:审图系统中加载模型或图纸
系列目录 [已更新最新开发文章,点击查看详细] 在之前的<C#开发BIMFACE系列>中主要介绍了BIMFACE平台提供的服务端API接口的封装开发与测试过程. 服务端API测试通 ...
- 基于开源的GOCW和Directshow.net,实现摄像头预览、采集、录像等操作
本文基于开源的GOCW和Directshow.net,实现图像采集等操作.最为关键的部分在于可以实现摄像头的控制,同时关于视频采集进行了实现. 具体的内容请关注首发于51CTO的课程<基于Csh ...
- 走进docker-swarm 带大家快速掌握docker自带编排工具
什么是Docker Swarm? 对比Docker 前面我们介绍过Docker可以理解成是一个我们的服务的独立运行的容器,那么在实际工作中,我们的系统可能是一个微服务应用,系统中根据业务拆分成多个模块 ...