栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11 中的内联函数、auto关键字、for循环及空指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11 中的内联函数、auto关键字、for循环及空指针

C++ 3
  • 内联函数
    • 概念
    • 特性
  • auto关键字
    • 定义
    • 使用
      • auto与指针结合起来使用
      • 在同一行定义多个变量
    • auto不能推导的场景
      • auto不能作为函数的参数
      • auto不能直接用来声明数组
  • 基于范围的for循环
    • 范围for的语法
    • 范围for的使用条件
  • C++11 中的空指针

内联函数 概念
以inline修饰的函数叫做内联函数,编译C++时会在调用内联函数的地方展开,没有函数压栈的开销,目的是提升程序运行的效率
特性
1、内联是一种以空间换时间的做法,省去调用函数额外开销,所以代码很长或者有循环或递归的函数不适宜作为内联函数
2、内联对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略到掉内联
3、inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就会找不到
auto关键字 定义
可以通过auto关键字来推出另一变量的类型
int a;
auto b = a;
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
使用 auto与指针结合起来使用
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须要加&
int main()
{
	int x = 10;
	auto a = x;
	auto* b = x;
	auto& c = x;

	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;

	return 0;
}
在同一行定义多个变量
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器只会根据第一个类型进行推导,然后用推导出来的类型定义其他变量
void TestAuto()
{
	auto a = 1, b = 2;
	auto c = 3, d = 4.0 //该行代码会编译失败,因为c和d的初始表达式类型不同
}
auto不能推导的场景 auto不能作为函数的参数
void TestAuto(auto a)
{}
auto不能直接用来声明数组
void TestAuto()
{
	int a[] = {1, 2, 3};
	auto b[] = {4, 5, 6};
}
基于范围的for循环 范围for的语法
C++98中的for循环一般都是这么写的
int main()
{
	int ar[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	int n = sizeof(ar)/sizeof(ar[0]);
	
	for(int i = 0, i < n, i++)
	{
		cout << ar[i] << " ";
	}
	cout << endl;
	
	return 0;
}
但是需要通过n来计算数组的大小,但是C++11里边就不用这么写
int main()
{
	int ar[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

	for(auto &x : ar)
	{
		cout << x << " ";	//表示当x属于ar时访问x,循环打印
							//&表示x不开辟空间,就是数组中的一个空间
	}
	cout << endl;
	
	return 0;
}
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有的时候还容易犯错误。
因此C++11中引入了基于范围的for循环,for循环后的括号由冒号“:”分为两部分:
	第一部分是范围内用于迭代的变量
	第二部分则表示被迭代的范围
与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环
范围for的使用条件
1、for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;
对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围

2、迭代的对象要实现++和==的操作
C++11 中的空指针
由于NULL是一个定义为0的宏,所以一个指针指向0和NULL没有任何区别
在C++11中如果想定义一个指针为空,应该为
int *p = nullptr;

注意:
1、在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的
2、在C++11中,sizeof(nullptr)与sizeof(void*)0所占的字节数相同
3、为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433475.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号