目标
培养正规的、大气的编程习惯
以良好的方式编写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内联函数

  1. inline关键字用来定义一个类的内联函数,解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。函数定义在构造函数body内部,自动声明为inline,即类中的成员函数缺省都是内联的,但能否内联要看编译器,在构造函数外部声明内联函数要加inline关键字

  2. 限制:inline只适合函数体内代码简单的函数,不能包含复杂的结构控制语句例如while、switch,并且不能内联递归函数。

  3. 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++学习记录-面向对象高级编程上相关推荐

  1. 侯捷C++学习记录-面向对象高级编程下

    本章谈到三大函数.stack堆.heap栈和内存管理. new 操作 与 delete 操作,最后对String类实现进行复习. 学习static 关键字及类模板涉及到的设计模式有:单例模式.Adap ...

  2. 一、C++面向对象高级编程(上) (侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...

  3. Python学习之面向对象高级编程

    Python学习目录 1. 在Mac下使用Python3 2. Python学习之数据类型 3. Python学习之函数 4. Python学习之高级特性 5. Python学习之函数式编程 6. P ...

  4. 【C++】侯捷C++面向对象高级编程(上)

    C++面向对象高级编程 前言 C++ Programs代码基本形式 文件类型 头文件写法 头文件布局 class1--complex 类的声明 inline--内联函数 class访问级别(acces ...

  5. 【C++】01-C++面向对象高级编程(上)-笔记(侯捷系列)

    1.在设计一个类的时候,数据应该尽量是private的,几乎没有例外. 2.构造函数应该用冒号后面初值列的形式,不应该在构造函数的函数体里面去赋值. 例如, A::A(int a) : m(a) {/ ...

  6. 一、C++面向对象高级编程(下) (侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...

  7. C++面向对象高级编程十九讲

    文章目录 0 背景 1 内容 0 背景 因为本人的C++基础不是很扎实,很多面向对象的基本语法掌握的不是很熟练,导致写程序出错时,经常会犯错,于是就去网上找到了侯捷老师的C++课进行观摩学习. 本文是 ...

  8. 侯捷C++课程笔记01: 面向对象高级编程(上)

    本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(上) pdf版本笔记的下载地址: 笔记01_面向对象高级编程(上),排版更美观一点(访问密码:3834) 侯捷C++课程笔记01: 面向对象高 ...

  9. 侯捷面向对象高级编程(二)

    侯捷面向对象高级编程(二) 转换函数 转换函数没有返回值,返回值就是double即函数名,不需要自己写 因为转换函数一般不会改变其中内容,所以要加const限定 两条路都可以走,就回产生歧义,报错 e ...

最新文章

  1. Python Tutorial(十):浏览标准库(一)
  2. 32位x86处理器编程导入——《x86汇编语言:从实模式到保护模式》读书笔记08
  3. kafka如何彻底删除topic及数据
  4. 前端笔记-vue中使用router进行页面跳转及除掉url中的#
  5. Objective-C中的一些特殊的数据类及NSLog的输出格式
  6. Javaslang 3.0之路
  7. SpringCloud的GateWay网关中怎么debug得到真实的路由地址
  8. 数学建模6 典型相关分析
  9. 电子地图有比例尺吗?
  10. hl uoj1841 走格子
  11. springboot呼伦贝尔旅游网站的设计与实现毕业设计源码091833
  12. Unable to start debugging.报错
  13. 这些道理不懂,你注定就是穷打工的命!
  14. 扩展系统功能——装饰模式(四):透明与半透明装饰模式,装饰模式注意事项,装饰模式总结
  15. 八大行业Hadoop大数据应用回顾和展望
  16. Trister‘s Lend告诉你如何选对借贷平台
  17. 人脸检测——DDFD
  18. reading 摘录二
  19. Element-UI组件之表单Form
  20. 拉索检测机器人_斜拉桥拉索检测机器人控制系统设计

热门文章

  1. 类微信界面框架的搭建
  2. 公司注册的企业邮箱竟然有邮件撤回的功能?!
  3. [矩阵论] Unit 6. 矩阵的 Kronecker 积与 Hadamard 积 - 知识点整理
  4. 点击商品进入详情页面
  5. 【实操】python opencv将图片合成视频,并插入音频
  6. php处理证件照_ps怎么精修证件照
  7. word排版案例报告_导师:论文排版都搞不好,你拿什么去投稿?!
  8. c语言游泳是怎么钓鱼的,钓鱼怎么找水层?看完这篇你就懂!
  9. STM32驱动BH1750模块
  10. Library projects cannot set applicationId问题解决