C++ 基本兼容 C 的语法。C++ 又增加了一些自己的语法,比如说引用、函数重载这些...
C++ 关键字(C++ 98)
C++ 大概新增了三十几个关键字,C++ 总计 63 个关键字,C语言 32 个关键字。
C++ 写个 Hello World 要包一个 iostream 的头文件然后都会写一个 using namespace std; 这个 std
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World";
}
命名空间
命名空间其实是补 C语言 的一个坑,C语言 它没有解决命名冲突的问题,比如说定义一个变量叫 rand 又正好包了一个头文件 #include <stdlib.h> 会发现这边就报错了,这种问题叫做命名冲突。
C++ 就新增了一个关键字叫 namespace 后面可以定义一个名字,这个名字就是一个域,里面的东西就属于这个命名空间。这边在访问这个 rand 的时候它默认访问的是库里面的。
想访问自己的就要用 :: (域作用限定符)来指定命名空间域。同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
using namespace 用来展开命名空间,如果全局域没有就回去展开的域中去找。
还有一种用法,单独展开常用的。
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
缺省还有全缺省和半缺省之分。全缺省可以都传也可以都不传还可以传一部分,但是它这边规定只能从左往右给,比如只传一个 1 不能跳过 a 去给 b。
半缺省是缺省部分参数,缺省必须从右往左。
缺省参数不能在函数声明和定义中同时出现。分离定义时,声明给缺省参数。
函数重载
函数重载是函数的一种特殊情况,C++ 允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)必须不同。就是一个函数有多个意思。
返回值不同无法构成重载。
引用
引用不是定义一个新的变量,而是给已有的变量取了一个别名,它在类型和变量之间。它和它引用的变量公用同一块内存空间。
引用在定义的时候必须初始化,一个变量可以有多个引用,引用一旦引用一个实体再不能引用其它实体。
指针和引用用途基本是相似的,指针更强大,更危险,更复杂,引用相对局限一些定义时必须初始化之后不能引用其它实体,引用更安全更简单。
内联函数
以 inline 修饰的函数叫做内联函数,编译时 C++ 编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。 内联本质上是针对宏函数的优化。inline 在符合条件的情况下在调用的地方展开,在 Debug 下内联是默认不展开的。
inline 是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
inline 对于编译器而言只是建议,编译器会自动优化,如果定义为inline的函数体内有递归或比较长等等,编译器优化时会忽略掉内联。
inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开就没有函数地址了,链接就会找不到。
auto 关键字(C++11)
使用 auto 修饰的变量是具有自动存储器的局部变量。C++11 中,标准委员会赋予了 auto 全新的含义即:auto 不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto 声明的变量必须由编译器在编译时期推导而得。
auto 最常用的地方是和范围 for 结合。它会自动推导类型然后会自动依次取 a 里面的数据赋值给 e ,自动迭代,自动判断结束。
auto 还能与指针和引用结合起来使用。用 auto 声明指针类型时,用 auto 和 auto* 没有区别,但用 auto 声明引用时则必须加 &
auto 不能在同一行定义多个变量
auto 不能作为函数的参数
auto 不能直接用来声明数组