1. 什么是C++
比较流行的编程语言
与底层硬件紧密结合:比如大端法与小端法,根据硬件决定
对象生命周期的精确控制:C#不用关注对象什么时候销毁,C++需要程序员处理,不需要额外线程去垃圾回收
Zero-Overhead Abstraction:不需要对不适用的语言特性付出成本,比如虚函数。使用了语言特性不等于付出运行期成本(部分运算可以交给编译期)
C语言的扩展
关注性能、引入大量特性,便于工程实践
C++标准的工业界实现
有很多不同编译器,每个编译器可能并不完全遵照标准;不同实现存在差异(不同编译器有不同结果,但是都是对的,可能因为C++标准没有明确规定)
不能脱离语境
编译环境、标准。编程时要注重性能与标准
2、开发环境及相关工具
一般用集成开发环境:VS/codelite/code::blocks
工具:/usr/bin/time:linux看程序用时、valgrind:检查程序泄露
cpp reference: 百科全书,查标准
compiler explorer: 网站,生成汇编代码并与原程序对应,且能选编译器
C++ insights: 把新的语法变成等价的程序,帮助理解
3、C++的编译/链接模型
分块处理
将文件分块,一个个编译成为目标文件,再链接在一块成为可执行程序
概念
定义/申明:不同文件同时使用变量、函数等,在其中一个定义,其他的申明,就可以通过编译,链接的时候再去查找。
头文件/源文件:如果很多申明都申明在一个文件,直接全部都写在头文件,别的源文件文件只需要引用头文件。提升书写效率。头文件也可以包含定义。
翻译单元:源文件+相关头文件-应该忽略的预处理语句
一处定义原则:所有的翻译单元中只有一个定义
过程 预处理:把源文件变成翻译单元。防止头文件被循环展开(比如两个头文件互相包含,解决方式是#ifndef xxx #define xxx #endif 就是如果我没定义过我就定义。#progra once是更好的解决方案,因为前种方法可能有同名头文件 )->编译:预处理完的输入变成汇编代码->汇编:变成机器语言->链接:把所有目标文件放在一起成为可执行程序
增量编译/全部编译:改头文件的时候基本选择全部编译,增量编译是源文件更改就可以随之增量编译
链接:把所有目标文件合在一起,可能会出现编译成功但是链接失败