Skip to content

Latest commit

 

History

History
431 lines (389 loc) · 18.7 KB

README.md

File metadata and controls

431 lines (389 loc) · 18.7 KB
title tags renderNumberedHeading grammar_cjkRuby
C++学习
true
true

[TOC]

C++发展介绍

编程语言排行榜TIOBE

==https://www.tiobe.com/tiobe-index/==

C++热度

C++应用领域

  • 游戏(Cocos2d-X)、图像、多媒体、网络、嵌入式
  • 数据库(Oracle、MySQL)、浏览器(Chrome)、搜索引擎(Google)
  • 操作系统、驱动程序、编译器(GCC、LLVM)、编程语言(Swift)
  • HPC(High Performance Computing,高性能计算)
  • IOS开发(Runtime、AsyncDisplayKit)
  • Android开发(NDK、fresco【匿名共享内存,Ashmem,Anonymous Shared Memory】)
  • Java开发(JNI)
  • ……

==总结 #9C27B0==

  • C++之所以应用范围如此广泛,得益于它的高效性、稳定性、跨平台性
  • 虽然C++在很多大型应用中,无法施展拳脚;但在某些领域,如同巨人一般,而且是不可或缺的顶梁柱
  • 基本只要是用到C++的地方,都是高大上的地方

有没有必要学习C++

  • C++ 可以说是当今很多流行语言(Java、Python等)的老祖宗,学习C++,相当于理解了流行语言的前世今生
  • 多尝试几种不同的编程语言,能提供不同的编程思维视角,站在更高的维度去思考代码
  • C++是一门在面向过程和面向对象方面都比较完善的语言,能让我们更接近真相(本质)
  • C++程序员转什么领域都可以很快上手
  • 如果你想做个普通的程序员,学好所熟悉的语言基本够用,如果想要成为一个有生产力的程序员,C++是进阶必备
  • 修炼内功,掌握本质,提升逼格
  • 程序员鄙视链:汇编 ->C->C++ ->Java、C# ->PHP

既然C++执行效率这么高,为什么还要出现新的编程语言?

  • 每一门语言都有自己的优缺点,都有自己擅长的领域

  • 新的编程语言趋向于更加简洁、高效(开发效率)

  • 为了适应不同的应用场景,新的编程语言就诞生了

  • 统计分析:R

  • 网站开发:HTML、CSS、JavaScript

  • 访问数据库:SQL

  • 爬虫:Python

  • ……

  • 创造一门新的编程语言的成本,有时候会比改进一门编程语言的成本更低

C++自身也在不断发展和完善

利用汇编挖掘编程语言本质

学习建议

代码本质挖掘

  • sizeof不是函数,是编译器特性
  • C++中,++a是可以被赋值的,a ++不可以被赋值
  • 对比if-else,编译器会对switch作一定的优化,提高执行效率

程序的本质

寄存器与内存

编程语言的发展

一些编程语言的本质区别

==汇编的格式和CPU架构有关==

编程语言分类

  • 编译型的语言(不依赖虚拟机) C/C++/OC/Swift
  • 脚本语言 Python/JS/PHP
  • 编译型的语言(依赖虚拟机) Java/Ruby

开发环境搭建

VS下载地址

https://visualstudio.microsoft.com

新建项目

字体设置

显示行号

大括号的位置

快捷键设置 - 添加/取消注释

常用快捷键

安装需要的组件

修改VS默认编码为UTF- 8

VS项目文件说明

.vs目录是用来存储当前用户在解决方案中的工作配置,具体包括VS关闭前最后的窗口布局、最后打开的选项卡/操作记录/文件文档、某些自定义配置/开发环境、调试断点等这类设置信息和状态。这样每当用户关闭解决方案后再重新打开,就能继续之前的工作状态。

在VS2015之前的版本,这些信息都是散乱的保存在解决方案根目录下(最明显的参照物就是.suo文件),现在是将这些统一放在.vs这个隐藏文件夹里,如果没在Windows系统中开启查看隐藏的文件和文件夹,还是很容易无视的。

sln文件是整个解决方案的配置文件,(Microsoft Visual Studio Solution),通过为环境提供对项目、项目项和解决方案在磁盘上的位置的引用,可以将他们组织到解决方案中。

vcxproj文件是项目文件,保存了整个项目的配置信息。经过测试可以通过打开这个文件来直接打开这个项目以及解决方案。

vcxproj.filters文件是文件存放工程的虚拟目录信息,也就是在解决方案浏览器中的目录结构信息。

一般情况下,如果我们要把源码共享到github中,只需要提交工程相关的配置文件,不提交用户个人偏好相关的配置文件。所谓的个人偏好相关,是指根据用户个人的VS使用习惯而保存的配置信息,比如选择了查看所有文件选项,打开了某一个文件。而工程相关的配置是指工程建立相关的信息,不受用户偏好的影响,比如解决方案的名字是什么,这个解决方案下面有哪些project。所以,我们只需要上传sln配置文件、vcxproj和vcxproj.filters配置文件就可以了,当然还包括源码。

汇编语言

AT&T汇编 vs Intel汇编

x64汇编 - 寄存器

x64汇编要点总结

内联汇编

C++常用语法

cin、cout

断点调试ALT+G

函数重载(Overload)

用Java中的说法就是方法签名=方法名+参数类型,方法名相同,方法签名不同即为函数重载

因为函数体过于简单,所以编译器会做优化,禁止优化即可在IDA中看到call的过程

函数命名倾轧

默认参数

默认参数只是编译器帮我们做了些事情,函数调用的时候可以不传默认参数,但实际反汇编看到的还是连同默认参数都会push入栈

extern"C"

CPP想要调用C语言开发的第三方库,需要在声明中加extern"C",否则CPP的Name Decoration会导致编译报错,所以第三方库的头文件需要加extern"C",但此时C文件调用C写的第三方库时又会报错,原因是C语言源文件是不认识 extern"C"的,所以有个需求就是希望头文件在CPP中自动加上 extern"C,C文件就不要加,刚好在CPP文件中会自动定义__cplusplus这个宏,所以可以通过这个宏来区分是不是CPP环境

第三方库函数之间可能会发生相互调用,例如前面的函数调用后面的函数,所以第三方库包含自己的头文件也是很有必要的事情

一个头文件可能会多次包含,虽然多次声明不会报错,但是编译器预处理会浪费更多的时间,所以头文件也需要用宏来控制条件预编译,宏的名称也是随意的,但是有概率性两个不同头文件用了同一个宏,导致出错,所以约定俗称用文件名前后各加两个下划线

#ifndef、#define、#endif可以针对一个文件中的部分代码,而#pragma once只能针对整个文件

#pragma once

内联函数(inline function)

VS窥探内联的本质

内联函数与宏

表达式

const

引用(Reference)

引用的本质

常引用(Const Reference)

数组的引用

变量地址总结

面向对象

面向对象的常见知识点

C++编程规范

对象的内存布局

this

思考

指针访问对象成员的本质

封装

内存空间的布局

堆空间

X86环境(32bit)

堆空间的初始化

memset

对象的内存

构造函数(Constructor)

构造函数的调用

默认情况下,成员变量的初始化

成员变量的初始化

析构函数(Destructor)

声明和实现分离

命名空间

思考

命名空间的嵌套

命名空间的合并

其他编程语言的命名空间

继承

对象的内存布局

成员访问权限

初始化列表

思考

初始化列表与默认参数配合使用

构造函数的互相调用

父类的构造函数

继承体系下的构造函数实例

构造、析构顺序

父类指针、子类指针

多态

虚函数

虚表

虚表(X86环境的图)

虚表汇编分析

VS的内存窗口

调用父类的成员函数实现

虚析构函数

纯虚函数

多继承

多继承体系下的构造函数调用

多继承 - 虚函数

同名函数

同名成员变量

菱形继承

虚继承

静态成员(static)

静态成员经典应用 - 单例模式

cosnt成员

应用类型成员

拷贝构造函数(Copy Constructor)

调用父类的拷贝构造函数

拷贝构造函数

深拷贝、浅拷贝

深拷贝示例

对象型参数和返回值

匿名对象(临时对象)

隐式构造

编译器自动生成的构造函数

友元

内部类

内部类 - 声明和实现分离

局部类

其它语法

运算符重载(operator overload)

调用父类的运算符重载函数

单例模式补充

仿函数(函数对象)

运算符重载注意点

模板(template)

函数模板

多参数模板

类模板

类模板中的友元函数

类型转换

const_cast

dynamic_cast

static_cast

reinterpret_cast

C++标准的发展

C++11新特性

Lambda表达式

Lambda表达式 - 示例

Lambda表达式 - 外部变量捕获

Lambda表达式 - mutable

C++14

C++17

错误

异常

异常的抛出声明

自定义异常类型

拦截所有类型的异常

标准异常(std)

智能指针(Smart Pointer)

智能指针的简单自实现

shared_ptr

shared_ptr的原理

思考下面代码有没有问题

shared_ptr的循环引用

weak_ptr

weak_ptr解决循环引用

unique_ptr