C++----auto_for_nullptr

1、auto关键字

1.1 auto的定义

早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
即auto可以自动识别变量的类型。

int main()
{
	int x = 10;
	auto a = &x;
	auto* b = &x;
	auto& c = x;//int& c=x;

	cout << typeid(a).name()<<endl;//typeid().name()的作用是打印数据类型
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;

	return 0;
}

C++----auto_for_nullptr_第1张图片
注意:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推auto
的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编
译期会将auto替换为变量实际的类型。

1.2 auto的使用细则

1.2.1 auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须
加&

int main()
{
	int x = 10;
	auto a = &x;
	auto* b = &x;
	auto& c = x;//int& c=x;

	cout << typeid(a).name()<<endl;//typeid().name()的作用是打印数据类型
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;

	return 0;
}

1.2.2 在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译
器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

void Test()
{
  auto a = 1, b = 2;
  auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

1.3 auto不能推导的场景

1.3.1 auto不能作为函数的参数

void TestAuto(auto a)// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
{}

1.3.2 auto不能直接用来声明数组

void Test()
{
  int a[] = {1,2,3};
  auto b[] = {456};
}

2、基于范围的for循环

2.1 范围for的语法

如果要遍历一个数组,可以按照以下方式进行:

int array[] = { 1,2,3,4,5,6 };
	for (auto e : array)//auto e的作用是自动获取array数组中的值
		cout << e << " ";

如果要修改array数组中的值,可以加&:

int array[] = { 1,2,3,4,5,6 };
	for (auto& e : array)
		e *= 2;
	for (auto e : array)
		cout << e << " ";

image.png

2.2 范围for的使用条件

2.2.1 for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供
begin和end的方法,begin和end就是for循环迭代的范围
注意:以下代码就有问题,因为for的范围不确定

void Test(int array[])
{
  for(auto& e : array)//for (int e : array)这样写也可以
    cout<< e <<endl;
}

3、指针空值nullptr(C++11)

C++中的NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量,在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。
为了避免这种情况,可以使用nullptr,但使用nullptr需要注意:
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入
的。
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

你可能感兴趣的:(c++)