内联函数
将一个函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开。这样就没有函数调用建立栈帧的开销,可以提升程序运行的效率。
一般来说,内联机制用于优化规模较小(即函数不是很长,没有具体的说法,取决于编译器内部的实现)、流程直接、频繁调用的函数。一般的编译器不支持内联递归函数。
内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。
内联和宏
内联是C++的语法,在C语言中使用宏。但是宏有一些缺陷
宏的缺点:
1、不方便调试宏(因为预处理阶段进行了宏替换)
2、导致代码可读性差,可维护性差,容易误用
3、没有类型安全的检查
基于宏的这些缺点,C++就引入了内联函数。
那么C++哪些技术替换了宏
1、常量的定义(#define N 100 ——> const N = 100)
2、短小的函数使用内联函数。
auto关键字
auto使用准则
范围for
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(auto e : arr)
cout << e << ' ';
注意:与普通循环类型,可以使用continue结束本次循环,也可以使用break跳出循环。
范围for的使用条件
1、for迭代的范围必须是确定的
对于数组而言,就是数组的第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end方法,begin到end就是范围
void fun(int arr [])
{
for(auto e : arr)
{
cout << e << ' ';
}
}
这是不允许的,因为数组传参是一个指针,并不是一个数组。所以这个范围没有确定。
2、迭代的对象要实现++和==操作
NULL和nullptr
NULL是C语言的一种用法,其实它并不是一个指针类型,它是利用宏替换。#define NULL 0
想要将它当成指针类型使用,必须强转。像这样:(int*)NULL
所以C++引用了一个新的关键字nullptr
注意:在C++11中,sizeof(nullptr) == sizeof((void*)0);