CPP 003 (内联函数,auto,范围for,nullptr)

一,内联函数

1,概念

inline修饰的函数叫做内联函数。

编译时,内联函数会被c++编译器用函数体替换函数的调用,没有函数压栈的开销,提升程序运行的效率。

内联函数一般应用在一些短小但是调用频繁的函数。

2,内联函数的特性

1>是一种用空间换时间的做法,当代码段过于长或者有循环 / 递归的函数不适合作为内联函数

2>inline对于编译器而言只是一种建议。如果定义为inline的函数体内有递归或者函数内部的代码较长,编译器优化时会忽略掉内联。

3>内联函数不可以声明和定义分离。当inline展开时,就不存在函数地址了,分离会导致连接错误,使链接找不到。

3,内联函数和宏的比较

C语言中,宏函数也可以实现inline的功能。

宏有以下的优缺点:

优点:复用性强,提高效率,减少站帧的创建

缺点:可读性差,不方便调试,无类型安全的检查

由于inline几乎解决了宏函数缺点的同时兼具宏函数的优点,所以我们在C++之中不再建议使用宏,而是建议使用const,enum,inline替代宏。

二,auto关键字

1,auto的说明

auto的使用目的是让编译器自动推导变量的实际类型。

使用auto定义变量时必须对其进行初始化,在编译阶段编译器会根据初始化表达式来推导auto的实际类型。

2,使用细则

1>与指针和引用的的结合

当我们使用auto声明指针类型时,auto和auto*是没有区别的。但当我们声明引用变量时,必须加&。

2>在同一行定义多个变量

当在同一行定义多个变量时,这些变量必须都是相同的类型,否则编译器会报错。因为编译器只会对第一个变量进行类型的推导,之后会把这个推导出来的结果应用在后续的变量上。

3,不能推导的场景

1>auto不可以作为函数的参数,因为编译器无法对函数参数的实际类型进行推导

2>auto不可以直接用来声明数组

三,范围for

1,范围for的语法

对于一个有范围的集合,由程序员来说明范围是多余的,并且很容易犯错误,故C++11提供了范围for。for循环后面的括号由:分为了两个部分,第一部分是在范围内用于迭代的变量,第二部分则表示迭代的范围。

范围for一般会和我们刚才学习的auto一起使用。

范围for只可以用传值或传引用接收,不会识别指针类型。

int arr[10]={1,2,3,4,5,6,7,8,9,10};

//对于一个数组,我们以前想要遍历他得写这样的代码:
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
    cout<<arr[i]<<" ";
}

//当我们使用范围for,代码就会简洁很多
for(auto e : arr)
{
    cout<<e<<" ";
}

//如果我们在遍历的同时,还想将所有的数值变大两倍,则可以用引用
//对于以下代码,e就是arr中各个数据的别名,所以e变化会引起arr内数据的变化
//同样的,若是我们不写&,e就是arr内数据的临时拷贝,e的变化不会引起arr变化
for(auto& e : arr)
{
    e*=2;
    cout<<e<<" ";
}

2,范围for的使用条件

1>迭代的范围必须是确定的

        对于数组是第一个元素和最后一个元素的范围;对于类而言,应该是提供的begin与end。

2>迭代的对象要实现++与==的操作

四,nullptr

1,NULL

在c语言使用的NULL,其实是定义的一个宏,位于<stddef.h>中。

#define NULL 0

NULL被定义成为了字面常量0,或者被定义为无类型指针(void*)的常量,这会引起一些麻烦。

2,nullptr

当nullptr表示指针空值时,不需要包含头文件,因为nullptr是一个新关键字,用于替代NULL。并且,sizeof(nullptr)与sizeof((void*)0)所占字节数相同。

为了提高代码的健壮性,建议表示指针空值时不要使用NULL,而是使用nullptr。

本节小结:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值