C++--基础知识--内联函数--auto关键字--基于范围的for循环--指针空值

内联函数

inline修饰的函数叫做内联函数:
在这里插入图片描述

inline int add(int a, int b){		//简单内联函数
	return a + b;
}

inline int fun1(int n){				//较为复杂
	
	for (int i = 1; i < n; ++i)
		n += i*n / (i + 1)*n;
	return n;
}

void test2(){
	
	int a = add(10, 20);	//实际编译时: int a=10+20
	
	int n = 10000;
	n = fun1(n);		//过于复杂的时候,使用内联函数也是没有效果的

}

特性:

1.inline就是利用空间换取时间,省去了函数的开销,在代码很长或者存在循环或者递归的时候就不适宜使用内联函数.

2.inline 只是对编译器提出的一个建议,然后编译器会自己选择是否对目标函数进行优化.

3.inline不建议声明和定义分离

auto关键字

用我的话来总结,auto 就是一个万能的变量类型名,类似于一个指示符,在你将你想传入的参数直接利用auto传入的时候,它会自动隐式的转成所对应的类型存储起来!

知识点 :typeid(变量).name() 将需要显示的类型显示出来

使用规则:

1.在使用auto声明指针变量的时候,使用autoauto* 没有区别,但是在声明的时候,必须要进行取地址的操作,如:auto&

2.在一行中定义多个变量的时候,必须是相同类型的,否则编译器会报错.

void test1(){
	
	//auto: 自动类型推导(自动识别你输入数据的类型)
	//相当于一个类型的调用符
	auto a = 10;
	auto b = 2.0;
	auto c = 'a';
	auto d = 'a' + b;
	//定义指针:都可以,因为你可以从右边的&符号看出来
	auto pa = &a;		//指针
	auto* pb = &a;

	//定义引用:必须加&
	auto& rc = b;
	auto f = b;

	int j, k, l;
	//auto a = 10, b = 60, c = 'a';	//报错,同一行必须是同一个类型

	cout << typeid(a).name() << endl;		//显示出类型
	cout << typeid(b).name() << endl;		//同样的操作
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;


	cout << typeid(pa).name() << endl;
	cout << typeid(rc).name() << endl;
	cout << typeid(f).name() << endl;
}

主要在于理解,不懂的话就多写代码尝试一下.

基于范围的for循环

对于我们现在敲的代码来说,在很多情况中我们都没有必要来说明所在的范围,所以我们这里就引入了一个新的范围for,可以不必在乎所在的范围,将整个需要循环的直接循环.

范围for: 当前的数据 : 循环的范围

void test3(){

	//====这个时我们普通的循环方式
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i){
		
		cout << arr[i] << " ";
	}
	cout << endl;


	//范围for:   当前的数据 : 循环的范围
	//只是循环的条件发生了变化,其他的都是一样的
	for ( int& e : arr){		//如果在这里加了const 则值不会被修改,后面的赋值也没有办法
		cout << e << " ";
		//e = 10;		//在第一次循环后,其对应的值被修改成了全10,
						//所以如果后面需要重新循环的时候,其所包含的值为全10
						//但是如果你在对应的变量之前加上const .他就会变成固定的,无法改变
	}
	cout << endl;

	for (int e : arr){		
		cout << e << " ";
	}
	cout << endl;

	for (const auto& e : arr){
		cout << e << " ";
	}
}

在数组作为参数的时候,数组名会退化成指针,范围是无法确定的,故----不能使用范围for

void fun(int arr[], int n){
	
	for (const auto& e : arr){		//数组作为参数不能使用范围for
		cout << e << " ";
	}
	cout << endl;
}

没有太多的理解,只要掌握了范围for并且能灵活运用就可以了.

指针空值

NULL其实就是0,在预处理的时候,它会被宏自动的替换.

当你在直接使用fun(NULL),的时候,因为NULL指的是0,所以就会调用第一个的整型,当你需要调用第二个指针类型的时候,就需要fun((int*)NULL)或者fun(nullptr),这两个操作其实是等效的,都可以用来调用指针的类型!

这里的 nullptr 指的就是 指针空值

//上面两个fun为所引入变量不同的函数
void fun(int a){
	cout << "fun(int)" << endl;
}
void fun(int* a){
	cout << "fun(int*)" << endl;
}

void test(){

	int* p = NULL;	//在预处理的时候,宏替换: int* p=0;
	int* p2 = 0;

	fun(NULL);		//在为空的时候,编译器会有限将NULL转换成整型,而不是指针类型
	

	fun((int*)NULL);//==
	fun(nullptr);	//建议使用下面的这个方式
	
	cout << typeid(nullptr).name() << endl;		//输出nullptr对应的类型,前面讲过
}

对于今天讲的还是一些关于C++的基础知识,大家多理解多吸收吸收,就能懂的! 多敲代码!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值