C++发展历史

Untitled

  • 1998 年定义第一个 C++ 标准为 C++98
  • 2003 年定义第二个 C++ 标准为 C++03
  • 2011 年定义第三个 C++ 标准为 C++11
  • 2014 年定义第四个 C++ 标准为 C++14
  • 2017 年定义第五个 C++ 标准为 C++17
  • 2020 年定义第六个 C++ 标准为 C++20

iOS项目中选择C++版本

Untitled

语法须知

C++的源文件扩展名是:cpp cc, 头文件:hpp h
C++程序的入口是main函数
C++完全兼容C语言的语法,其实就是C的扩充

#1. cin、cout

C++中常使用cin、cout进行控制台的输入、输出

Untitled

  • cin用的右移运算符>>,cout用的是左移运算符<<
  • endl是换行的意思

#2. 函数重载(Overload)

  • 函数名相同
  • 参数个数不同, 参数类型不同, 参数顺序不同

如下面这样

Untitled

下面这样写法可以吗?

Untitled

本质上:采用了name mangling的技术,其实就是就是对函数名进行改编,修饰生成不同的函数名字,不同编译器生成规则不一样

#3.默认参数

  • C++允许函数设置默认参数,在调用时可以根据情况省略实参
  • 默认参数只能按照右到左的顺序
  • 如果函数同时有声明、实现,默认参数只能放在函数声明中
  • 默认参数的值可以是常量、全局变量或者函数名

Untitled

#4. extern “C”

  • 被extern “C”修饰的代码会按照C语言的方式去编译
  • 如果函数同时有声明和实现,要让函数声明被extern “C”修饰,函数实现可以不修饰

下面会报错吗?

Untitled

由于C、C++编译规则的不同,在C、C++混合开发时,C库需要添加__cplusplus来适配C++环境

Untitled

防止头文件重复包含, 也可以使用#pragma once 达到通用的效果(针对整个文件,比较新的IDE支持)

1
2
3
4
5
#ifndef math_h
#define math_h

#endif /* math_h */

#5. 内联函数(inline function)

  • 使用inline修饰函数的声明或者实现,可以使其变成内联函数(建议声明和实现都增加inline修饰)
  • 作用:编译器会将函数调用直接展开为函数体代码,可以减少函数调用的开销,但是会增大代码体积
  • 注意:不要内联超过10行代码的函数,有些函数内联,但是编译器不会操作(递归函数)

#6. const 关键字

  • const是常量的意思,被其修饰的变量不可修改
  • 如果修饰的是类、结构体(的指针),其成员也不可以更改
  • const修饰的是其右边的内容

#7. 引用(Reference)

  • C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
  • C++中,使用引用(Reference)可以起到跟指针类似的功能
  • 引用相比指针更安全,且函数返回值可以被赋值
  • 引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
  • 一个引用占用一个指针的大小

注意事项

  • 引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
  • 对引用做计算,就是对引用所指向的变量做计算
  • 在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终”
  • 可以利用引用初始化另一个引用,相当于某个变量的多个别名 不存在【引用的引用、指向引用的指针、引用数组】

常引用(Const Reference)

  • 引用可以被const修饰,这样就无法通过引用修改数据了,可以称为常引用
  • const必须写在&符号的左边,才能算是常引用

特点:

  • 可以指向临时数据(常量、表达式、函数返回值等)
  • 可以指向不同类型的数据
  • 作为函数参数时(此规则也适用于const指针)
  • 可以接受const和非const实参(非const引用,只能接受非const实参)
  • 可以跟非const引用构成重载
  • 当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量

#8. 未完

其他资源

C++ 教程| 菜鸟教程:https://www.runoob.com/cplusplus/cpp-tutorial.html
C++11学习 https://blog.csdn.net/Innost/article/details/52583732
C++面试题30道 https://blog.csdn.net/fakine/article/details/51321544

推荐几本书

标准库STL学习 《STL源码剖析》
C++和C语法基础 《C++ Primer 中文版(第 5 版)
C++进阶 《Effective C++》, 《More Effective C++》
C++11新标准 《深入理解C++11》