侯捷C++学习记录-面向对象高级编程上
目标:
培养正规的、大气的编程习惯
以良好的方式编写C++ class 【Object Based(基于对象)】
学习Classes 之间的关系 【Object Oriented(面向对象)】
继承(inheritance)
复合(composition)
委托(delegation)
侯捷C++全套视频链接:https://pan.baidu.com/s/19PnDq2VuyonB0USk2ghXVA
提取码:xfr0
–来自百度网盘超级会员V1的分享
推荐书籍:C++ primer、Effective C++、STL源码剖析
文章目录
- 1.C++编程简介
- 2.头文件与类声明
- 2.1头文件声明
- 2.2 防卫式声明
- 2.3 类声明
- 2.4 inline内联函数
- 3. 构造函数
- 3.1构造函数初始化
- 3.2构造函数的重载
- 3.3模板简介
- 4.参数传递与返回值
- 4.1单例简介
- 4.2 常量成员函数
- 4.3 参数传递 传值/传引用
- 4.4 返回值传递 传值/传引用
- 4.5 友元
- 5. 操作符重载与临时对象
- 5.1 操作符重载
- 5.2 临时对象
- 6.复习complex类实现
1.C++编程简介
侯捷C++全套视频链接:https://pan.baidu.com/s/19PnDq2VuyonB0USk2ghXVA
提取码:xfr0
–来自百度网盘超级会员V1的分享
推荐书籍:C++ primer、Effective C++、STL源码剖析
2.头文件与类声明
2.1头文件声明
- 库中自带头文件
#include <xxx>
- 自定义头文件
#include "xxx"
2.2 防卫式声明
1.ifndef表示在文件内第一次没有定义时候,进行声明定义
2.在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件上时,就会出现大量“重定义”错误。
3.在头文件中使用#define、#ifndef、#ifdef、#endif能避免头文件重定义。
2.3 类声明
数据尽可能放在private中,函数绝大部分要放在public中
pubilc > protected > private(所有的数据都应该放在 private,打算被外界调用的函数应该是public)
2.4 inline内联函数
inline关键字用来定义一个类的内联函数,解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。函数定义在构造函数body内部,自动声明为inline,即类中的成员函数缺省都是内联的,但能否内联要看编译器,在构造函数外部声明内联函数要加inline关键字
限制:inline只适合函数体内代码简单的函数,不能包含复杂的结构控制语句例如while、switch,并且不能内联递归函数。
inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
3. 构造函数
3.1构造函数初始化
构造函数名与类名相同,可以有参数,参数也可以有默认值,没有返回类型,用于创建对象
构造函数中,成员变量初始化中使用":"函数方式列表初始化性能比直接在构造函数中赋值要快,建议使用这种方式。
public:complex (double r = 0, double i = 0): re (r), im (i) //将构造函数的参数赋值给私有成员变量 初始化的过程中就赋值{ } //相当于public:complex (double r = 0, double i = 0){re = rim = i}
不带指针的类大多不用写析构函数(内存泄漏)
3.2构造函数的重载
- 可以有很多重名的构造函数,即构造函数重载
- 重载real函数时,其实编译器会编译成两个函数,虽然同名但不重载
- 黄色标注的构造函数定义将出现问题,与上面的构造函数存在冲突,在无参初始化该类对象时,因为第一个构造函数已经有参数默认初始化列表了,定义该类对象时可以不加入参数,这就产生了冲突。
3.3模板简介
先不声明数据类型,调用的时候再全部替换,提高代码的复用性
4.参数传递与返回值
4.1单例简介
不允许被外界调用类,当需要调用的时候,用类里面声明的函数
- 采用关键字static,将构造函数ctor放在private中:设计模式-单例
4.2 常量成员函数
- const关键字:成员函数中没有改变成员变量的操作,如get函数,建议在该方法声明处加入const关键字
- 初始化类时,如果加入了const关键字,则该类不能被修改,只能读取属性,相应的,所调用的成员方法在定义时应该加上const关键字
4.3 参数传递 传值/传引用
- 函数参数传递,如果不需要改变参数值,建议使用 const + 引用 减小开销,速度快
- 尽量选择传引用作为函数参数
构造函数初始化的特殊写法
能加const的地方 就需要加
数据尽可能放在private中,函数绝大部分要放在public中
参数尽量考虑用reference来传(
类型 名称&/名称&
) 也需要考虑是否加const返回值尽量考虑用reference来传(
名称&
)
4.4 返回值传递 传值/传引用
返回值的参数传递也建议尽量传引用
好处:传返回值时,无论是传值还是传引用,返回值只接收引用,即传参时无需关心是传引用还是值
不能传reference的情况:返回值是在函数内部新创建的变量,其引用是该函数的一个指向堆局部变量指针,该变量的地址会在函数调 用完成后销毁,则此时返回值不应使用传地址
对于临时变量也不能返回引用:例如 + 运算符的重载
创建临时对象:
typename( xxx )
->int(i)
4.5 友元
- 友元函数可以自由取得private成员,不声明为friend的话,也可以通过函数来取得私有变量
- 相同类的各个实例对象互为友元,可以通过彼此的内部方法调用传入参数的内部私有成员变量。
5. 操作符重载与临时对象
5.1 操作符重载
- 任何一个成员函数都有一个隐藏的 this指针,不需要显式声明,但是可以使用,指向调用者,C2是调用者
- 如上图所所示,在运算符重载过程中隐藏了this指针,该指针编译器会处理,使用者不能显式声明
- 操作符重载时,返回值不能是void,单个操作时不会报错,但连续操作是由于没有返回值会出现问题
如果使用point指针,传递者必须知道是用point指针类型
5.2 临时对象
没有开辟新的对象让虚数和实数相加,直接用临时对象返回,不能用引用传递
6.复习complex类实现
具体可看源码
侯捷C++学习记录-面向对象高级编程上相关推荐
- 侯捷C++学习记录-面向对象高级编程下
本章谈到三大函数.stack堆.heap栈和内存管理. new 操作 与 delete 操作,最后对String类实现进行复习. 学习static 关键字及类模板涉及到的设计模式有:单例模式.Adap ...
- 一、C++面向对象高级编程(上) (侯捷)
侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...
- Python学习之面向对象高级编程
Python学习目录 1. 在Mac下使用Python3 2. Python学习之数据类型 3. Python学习之函数 4. Python学习之高级特性 5. Python学习之函数式编程 6. P ...
- 【C++】侯捷C++面向对象高级编程(上)
C++面向对象高级编程 前言 C++ Programs代码基本形式 文件类型 头文件写法 头文件布局 class1--complex 类的声明 inline--内联函数 class访问级别(acces ...
- 【C++】01-C++面向对象高级编程(上)-笔记(侯捷系列)
1.在设计一个类的时候,数据应该尽量是private的,几乎没有例外. 2.构造函数应该用冒号后面初值列的形式,不应该在构造函数的函数体里面去赋值. 例如, A::A(int a) : m(a) {/ ...
- 一、C++面向对象高级编程(下) (侯捷)
侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...
- C++面向对象高级编程十九讲
文章目录 0 背景 1 内容 0 背景 因为本人的C++基础不是很扎实,很多面向对象的基本语法掌握的不是很熟练,导致写程序出错时,经常会犯错,于是就去网上找到了侯捷老师的C++课进行观摩学习. 本文是 ...
- 侯捷C++课程笔记01: 面向对象高级编程(上)
本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(上) pdf版本笔记的下载地址: 笔记01_面向对象高级编程(上),排版更美观一点(访问密码:3834) 侯捷C++课程笔记01: 面向对象高 ...
- 侯捷面向对象高级编程(二)
侯捷面向对象高级编程(二) 转换函数 转换函数没有返回值,返回值就是double即函数名,不需要自己写 因为转换函数一般不会改变其中内容,所以要加const限定 两条路都可以走,就回产生歧义,报错 e ...
最新文章
- Python Tutorial(十):浏览标准库(一)
- 32位x86处理器编程导入——《x86汇编语言:从实模式到保护模式》读书笔记08
- kafka如何彻底删除topic及数据
- 前端笔记-vue中使用router进行页面跳转及除掉url中的#
- Objective-C中的一些特殊的数据类及NSLog的输出格式
- Javaslang 3.0之路
- SpringCloud的GateWay网关中怎么debug得到真实的路由地址
- 数学建模6 典型相关分析
- 电子地图有比例尺吗?
- hl uoj1841 走格子
- springboot呼伦贝尔旅游网站的设计与实现毕业设计源码091833
- Unable to start debugging.报错
- 这些道理不懂,你注定就是穷打工的命!
- 扩展系统功能——装饰模式(四):透明与半透明装饰模式,装饰模式注意事项,装饰模式总结
- 八大行业Hadoop大数据应用回顾和展望
- Trister‘s Lend告诉你如何选对借贷平台
- 人脸检测——DDFD
- reading 摘录二
- Element-UI组件之表单Form
- 拉索检测机器人_斜拉桥拉索检测机器人控制系统设计
热门文章
- 类微信界面框架的搭建
- 公司注册的企业邮箱竟然有邮件撤回的功能?!
- [矩阵论] Unit 6. 矩阵的 Kronecker 积与 Hadamard 积 - 知识点整理
- 点击商品进入详情页面
- 【实操】python opencv将图片合成视频,并插入音频
- php处理证件照_ps怎么精修证件照
- word排版案例报告_导师:论文排版都搞不好,你拿什么去投稿?!
- c语言游泳是怎么钓鱼的,钓鱼怎么找水层?看完这篇你就懂!
- STM32驱动BH1750模块
- Library projects cannot set applicationId问题解决