c++内敛函数、auto关键字、范围for循环

内敛函数

1.为什么有内敛函数

c语言库中的许多函数都是用宏函数来写的,主要原因调用函数会有参数压栈建立栈帧的消耗,宏函数是替换原来的函数,省去了建立栈帧的开销,提高了效率。但是宏函数很难阅读,不便维护。
c++中为了解决这一问题引入了内敛函数的概念,和正常函数定义方式一样,然后对函数进行替换,而不是建立栈帧。

2.内敛函数使用

内敛函数的定义就是在原来的函数前面加上 inline

inline int Add(int x, int y)
{
    
    
	return x + y;
}

下面我们看下源代码来理解
在这里插入图片描述

3.内联函数特性、注意事项

1.inline 的目的是用空间换取时间,主要换取的是调用函数建立栈帧消耗的时间,一般函数内部代码比较少的时候(1-5行)建议使用inline,但是当函数内部代码较多(多于10行)或者内部有循环/递归时不建议使用inline,当然此时编译器在编译时也不会把它当成内敛函数来编译,因为如果这样使用,则执行内部代码的时间远大于使用inline换取的时间。那使用inline也就没有意义了。
2.在内联函数的声明和定义一定不能分开。内联函数是在原位置展开的,并没有记录函数的地址,在链接时自然也就找不到该函数了。

4.宏函数的优缺点

宏函数:
优点:
1.代码复用性高
2.效率高
缺点:
1.可读性差
2.不方便调试

auto关键字

1.auto 的定义

在c++11后,auto已经变成了类型指示符,它定义变量时编译器可以在编译时推导出变量的类型。

2.auto的使用

	int a = 1;
	auto b = a; //编译器可根据表达式推导出来 b 是int类型

3.auto使用注意事项

auto 定义的变量必须初始化。因为编译器是根据表达式推导出变量的范围的。也可以认为auto只是占位用的,编译时编译器会将真正的范围替换auto。

4.auto使用细则

1.auto定义指针和引用

	int *a = nullptr;

	auto b = a;
	auto* c = a;//这两种方式都可以定义指针

	auto& d = a;//定义引用必须加 & 编译器才能推导出来定义的是引用

2.auto可以声明多个变量,但是多个变量的类型要相同

	auto a = 1, b = 2; //可以推导出 a和b 的类型是 int 

	auto a = 1.0, b = 2.0; //可以推导出 a和b 是float

	auto a = 'a', b = 'b';//可以推导出 a和b 是char

	auto a = 1, b = 2.0, c = 'c'; //这样定义就不行,因为编译器只根据声明的第一个元素
								//的类型来声明后续变量。

范围for循环

1.范围for循环的使用规范

int a[] = {
    
     1, 2, 3, 4, 5, 6 };

	//正常情况下遍历数组
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i)
	{
    
    
		cout << a[i] << " ";
	}
	cout << endl;

	//范围for遍历
	for (auto e:a)
	{
    
    
		cout << e << " ";
	}
	cout << endl;

2.范围for循环的使用条件

迭代的范围必须要确定,数组的范围就是第一个元素到最后一个元素。

void testFor(int *a)
{
    
    
	for (auto e:a)    //这样使用是不正确的 a 仅仅表示的是数组的首地址,无法确定数组的范围。
	{
    
    
		cout << e << endl;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_50168448/article/details/113558727