[C++笔记]C++11中的auto,范围for,以及nullptr

本文介绍了C++11引入的`auto`关键字,用于自动类型推导,简化代码,避免冗长的类型声明。同时讲解了`auto`在指针和引用中的使用差异,以及在范围for循环中的应用。此外,还探讨了C++11中的`nullptr`,作为替代宏定义`NULL`的安全指针空值。通过实例展示了`auto`和`nullptr`的使用方法及其在程序中的实际效果。
摘要由CSDN通过智能技术生成
#include<iostream>
using namespace std;

//auto关键字(C++11)
void AutoTest1() {
	//废弃了早期C的用法:
	//auto int a=0;//int a已经是默认存储类型,早期auto的意义被架空
	const int a = 0;
	//现改为:
	auto b = a;//自动根据右边的值推导左边的类型,a是什么类型b就是什么类型
	auto m = &a;
	auto c = 'A';
	auto d = 114.514;
	
//用typeid().name()打印变量类型
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;//注意,auto推出的类型不会包含const
	cout << typeid(m).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	cout << endl;
}

//用auto声明指针类型时,用auto和auto*没区别,但用auto声明引用类型时则必须加&
void AutoTest2() {
	int x = 10;
	auto a = &x;//int*
	auto* b = &x;//int*
	auto& c = x;//int
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	*a = 20;
	*b = 30;
	c = 40;
	cout << endl;
}
//*auto不能用于作参数和声明数组,因编译器无法推导实际类型

//auto的实际应用方式:
//std::map<std::string,std::string> dict ={{"sort","排序"}{"insert","插入"}};
//std::map<std::string,std::string>::iterator it = dict.begin();
//把上面的直接改成:
//auto it=dict.begin();//简化操作

//auto总结
//auto 要定义的变量名 = 已定义的变量名  可使编译器自动推导要定义的变量的类型--用于在类型很长时简化代码
//用auto一行声明多个变量时,该行变量类型必须相同
//auto不能作函数的形参,也不能直接用于声明数组

//auto的另一个好用处:一个语法糖--范围for
void TestFor(int a[]) {
	int array[] = { 1, 2, 3, 4, 5 };
	// C/C++ 遍历数组
	for (int i = 0; i < sizeof(array) / sizeof(int); ++i)
	{
		cout << array[i] << endl;
	}
	// C++11 范围for
	// 自动依次取数组array中的每个元素赋值给x并自动判断结束
	for (auto x : array){//不使用auto而手动写出类型,也叫范围for,用auto更方便且利于维护
		cout << x << endl;
	}
	for (auto& x : array) {//这里x和一般循环里的循环变量i生命周期不同,只针对当下的一次循环
		x++;//每个元素+1
	}
	//范围for的范围必须是确定的(数组范围就是首尾元素,而对于类应提供begin和end的方法)
	//如范围for数组,范围必须用数组名,而如int数组传参时会退化成int*,不再是数组名,begin和end不确定,范围不确定
	//在底层,范围for的汇编代码跟普通for其实一样
}

//C++11中的指针置空:nullptr
//一个历史遗留问题:c++中的NULL由宏定义为int类型的0,而不是((void *)0)
//	c++11起,作为补丁,推荐使用关键字 nullptr 作为原本的 NULL 的替代
void NullPointer(){
	//C++98/03
	int* p1 = NULL;
	int* p2 = 0;
	//NULL是宏定义的,预处理后替换为0,极端场景下用NULL会有问题:
	//比如,对于重载函数f(int)与f(int*),f(NULL)和f(0)都当作传了int处理
	//重载函数传NULL不能区分指针与整型,因此C++11起不再推荐用NULL

	//C++11
	int* p3 = nullptr;
	//nullptr作为关键字不需要包头文件,可以区分int* 0与int 0
	//在C++11中,sizeof(nullptr)==sizeof((void*)0)为真
}

int main() {
	AutoTest1();
	AutoTest2();
	int arr[] = { 1,2,3,4,5 };
	TestFor(arr);
	return 0;
}

//补充:
//打印变量类型:cout << typeid(变量名).name <<endl;

运行结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值