初识C++之内联函数 auto关键字
文章目录
- 初识C++之内联函数 auto关键字
- 一、 内联函数
- 1.1 定义
- 1.2 应用
- 1.3 特性
- 二、auto关键字
- 2.1 简介
- 2.2 auto的详细使用
- 2.3 范围for(C++)
- 2.4 注意事项
一、 内联函数
1.1 定义
以inline修饰的函数叫做内联函数,在在编译时编译器会在调用内联函数的地方展开,类似宏,没有函数调用建立栈帧的开销,内联函数提升了程序的效率
1.2 应用
示例:
#include <iostream>
using namespace std;
//inline int Add(int x,int y)
int Add(int x, int y)
{
int ret = x + y;
return ret;
}
int main()
{
int ret = Add(3, 5);
cout << ret << endl;
return 0;
}
没使用内联函数:是通过call 函数名 来调用函数
使用内联函数:在调用函数的地方展开,直接加
1.3 特性
- 内联函数对编译器来说只是一个建议,并不是加上inline,编译器就会当作内联函数处理,只有一些短的函数,不递归且频繁调用的函数会使用作内联函数
- 内联函数是一种用空间换时间的方法,在编译时,会展开内联函数替换函数调用,缺点:可能会使目标文件变大 优点:不需要建立函数栈帧,提升了程序的效率
- 内联函数的声明和定义不能分离,如果分离了,在inline被展开的时候,就找不到函数地址了,会造成链接错误
二、auto关键字
2.1 简介
auto作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得
TIPS:可以使用typeid(变量名).name()来查看auto的实际类型
#include <iostream>
using namespace std;
int Add(int x, int y)
{
return x + y;
}
int main()
{
auto a = 10;
auto b = 'x';
auto c = &a;
auto d = Add(3,5);
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
return 0;
}
代码运行结果:
int
char
int *
int
2.2 auto的详细使用
- auto与指针和引用
#include <iostream>
using namespace std;
int main()
{
auto a = 10;
auto b = &a;
auto* c = &a;
auto& d = a;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
return 0;
}
代码运行结果:
int
int *
int *
int
TIPS:auto用来声明指针类型时,auto 与 auto* 是没有区别的,但是auto声明引用时,只能是 auto&
- auto声明多个变量
#include <iostream>
using namespace std;
int main()
{
auto a = 10, b = 20;
//auto c = 30, d = 40.0; 报错
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
return 0;
}
在一次声明多个变量时,变量类型得一致,因为编译器只能对一个类型进行推导,然后再用推导出来的类型定义其他变量
2.3 范围for(C++)
普通的打印数组:
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
cout << arr[i] << " ";
}
return 0;
}
范围for打印数组:
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
for (auto e : arr)
{
cout << e << " ";
}
return 0;
}
范围for有两个部分组成
- auto e 范围内用于迭代的变量
- arr 被迭代的范围
注意:
范围for是将数组中的值赋值给变量,不能修改数组的值,所以可以在变量前加上引用& auto& e
和普通的for循环一样,可以使用 break 跳出循环 和 continue 结束本次循环
2.4 注意事项
- auto定义变量时,必须初始化,在编译阶段,编译器会根据初始化表达式来推到auto的类型,因此,auto只是一个类型声明时的占位符,在编译阶段会替换成实际的类型
- auto不能作为函数的返回值
- auto不能用来声明数组