C语言的扩展

  • 关注性能
    • 与底层硬件紧密结合,与JAVA、Pyhton不同
    • 对象生命周期的精确控制
    • Zero-Overhead Abstraction
  • 引入大量特性,便于工程实践

    • 三种编程范式:面向过程、面向对象、泛型
    • 函数重载、异常处理、引用

      什么是C++

  • 是一系列的不断演化的标准集合

    • C++98/03, C++11, C++14, C++17, C++20….. 不同的版本
    • 语言本身的改进
      • Memory Model
      • Lambda Expression
    • 标准库的改进 有些标准库会被淘汰,编译会报警告
  • C++标准的工业界实现
    • MSVC /GCC /Clang
    • 每个编译器可能并不完全遵照标准 标准是标准,实现是实现,每个公司出的工具跟C++标准可能不太一样,可能跟不上标准的更新速度
    • 不同的实现存在差异
  • 不能脱离具体的语境讨论C++
  • 编写程序时要注重:
    • 性能
    • 标准

      编译/链接模型

      每个阶段都可能有错误,也都相应的功能与技巧去避免

单独一次编译耗费资源,速度慢,需要分块处理,链接就是联系起不同的目标文件。
分块处理衍生出的概念:(层层递进的关系)

  • 定义/声明
  • 头文件/源文件、里面包含了所有的声明
  • 翻译单元
    • 源文件+相关头文件(直接/间接) ——应忽略的预处理语句
  • 一处定义原则:

    • 程序级:一般函数
    • 翻译单元级:内联函数,类、模板

      生成可执行文件过程

      预处理 preprocessor,

      生成.i文件,变成了翻译单元 。使用宏定义#ifndef # define #endif防止头文件重复展开
      使用#progma once防止重名误伤的情况
      #include <iostream>是一个预处理操作,在源代码被编译之前,替换或添加文本,也可以称作是头文件名

      编译Compiler

      将翻译单元转换为相应的汇编代码,文件是.s
      编译器可以进行优化
  • 提升速度

  • 不适合调试,可选择debug和release编译
    • 使用debug进行调试,relea是优化后的编译
  • 增量编译和全部编译,rebuild是全部编译

    汇编Assembler

    生成

    链接

    合并多个目标文件.o,关联声明与定义
    外部链接,内部链接
    常见错误:只有声明,找不到定义

    名称空间namespace

    using namespace std;using是编译指令,调用两个以上不同的库时,有些函数名会重名,需要封装在一个名称空间 的单元中。用法:Microflop::wanda(***)前面的Microflop就是命名空间

  • using namespace ***放在所有函数的外部,表示所有函数都能够访问名称空间

    输入输出流cout

    image.png
    cout是一个预定义的对象,知道如何显示信息;”<<”指的是将右侧的信息送入输出流中

    控制符endl

  • endl是控制符(manipulator)的一种,可以重起一行

  • 也可以使用C语言中的\n作为换行

    标记和空白

    很有意思的是,C++Prime这本书将代买中的符号称为token,也就是不可分割的元素叫做标记

    C++语句

    声明语句

    int carrots;提供了两项信息,需要的内存以及内存单元的名称,编译器负责分配和标记内存的细节。这条语句可以当成一个变量声明,C++使用变量前必须声明它,有效防止手残打错变量名出现的莫名其妙的bug

    赋值语句

    C++中可以使用连=符号进行赋值,从右向左结合

    cout的新花样

    与C语言中的printf不同,printf需要给出输出变量的类型,就算给错了照样有输出,只不过是乱码。
    而cout得益于C++的面向对象特性,能够识别输出变量的类型,算是运算符重载的一种。

  • cout可以拼接输出,标记间的换行符和空格看作可相互替换的,也就是换行也能续上去,只要没有;就是文本编辑的格式

    cin

    cin >> carrots 可以看作是流入程序的字符流,也是一个智能对象

    函数

    函数必须知道要有参数类型返回值类型
    函数原型是只描述接口,而函数定义有定义的代码
    调用函数 call

    main函数

  • 返回值是int类型,因为它是 int main()

  • return 0返回给操作系统,如果接收到0则表明程序运行正确,非0则有问题。

    运算符重载

    编译器可以通过上下文来确定运算符的含义