内联函数(C98)
1.含义
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。(官方术语)
C++内联函数和C语言的宏函数很像,都是在编译时调用的地方展开,函数调用要开辟空间消耗栈要花蛮多时间,而内联函数不要开辟和消耗栈,以空间换时间的处理方式。(my)
2.使用
在函数前加一个inline (内联的英文)
inline int Add(int a, int b)
{
return a + b;
}
3.注意:因为如果这个函数调用1000次,而函数内容有20个指令,如果用内联函数展开就有20000个指令,而函数调用的话只要1000 + 20个指令;反而没怎么优化。
所以内联函数只是建议编译器这样处理,如果函数指令较多或者有递归循环等,编译器会自己比较选择。所以内联函数一般使用于小于20行的函数。
b.inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会 找不到。(这个好容易忘记,因为我写的时候已经忘记了)
如图下 分离成 3个文件。
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
f(10);
return 0;
}
//无法解析的外部符号 报错报错
无法解析外部符号是因为在头文件F.h的inline void f(int i)展开后自动销毁了,导致在main中没有声明,所以报错。
4.宏的缺点(为什么不用宏呢?)
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 。
auto(C11)
1.含义
auto有个意思是自动和它的作用一样,auto a = b;自动转换成右边b的类型
2.注意点
a. auto不能作为函数的参数
b. auto不能直接用来声明数组
void TestAuto()
{
int a[] = { 1,2,3 };
auto b[] = { 4,5,6 };
}//报错 报错
基于范围的for循环(C11)
用C98的普通for,实现一个让数组内容×2,然后在打印出来。需要如下步骤。
void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
array[i] *= 2;
for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
cout << *p << endl;
}
C11的范围for(和其他循环一样,可以用break停止,也可以用continue)
范围for的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围。
范围for步骤如下
void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)
e *= 2;
for(auto e : array)
cout << e << " ";
}
相当于一直循环进行这个过程auto&e = array;e*=2;直至array没有元素了自动停止,非常简洁明了。(&是引用符号我空间有详细讲解)
ps:注意数组传参给函数时传的是首元素地址,所以array在函数中会退化成指针,范围性就失去了,故下列代码会报错。所以每次数组传参时要带上元素个数。
数组是典型的begin函数,而指针不是因为没有范围性。数组传参后退化成指针所以报错。
指针空值nullptr(C11)
在C语言中空指针是NULL,这个NULL是用宏定义的,在<stdio.h>中有#define NULL 0
所以在计算机编译时会用0将NULL换掉,而不是用(void*)0替代NULL;看这段代码理解深些。(利用了函数重载)
这就是为什么f(NULL)和f(0)的结果是一样,而nullptr解决了这个问题。类型对于重载函数来说非常重要。
注:
1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3.为了提高代码的健壮性和安全性,建议以后都用nullptr。
ps:让我们一起学习C++知识叭,如果有错误,可以指点指点我噢。一起进步!
标签:函数,int,auto,void,nullptr,内联,array From: https://blog.csdn.net/rwh04160416/article/details/137064181