C++入门(下)



前言

今天我们来了解一下C++入门中最后几个零碎的知识点,我们就能进入类的学习了!加油呀!


一、内联函数

1.含义

inline 修饰的函数叫为内联函数,编译时C++编译器会在用内联函数的地方展开,没有函数压栈的开销,提高程序运行的效率。
c语言中:
在这里插入图片描述
c++中:
在这里插入图片描述

2.内联函数的特征

1.inline是一种以空间换时间的做法,省去调用函数额外开销,所以代码很长或者有循环/递归的函数不适宜作为内联函数。
2.inline对于编译器而言只是一种建设,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。

  • inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

3.宏的优缺点

优点

  • 增强了代码的复用性
  • 提高了性能
    缺点
  • 不方便调试宏(预编译阶段进行了替换
  • 导致代码可读性差,可维护性差,容易误用
  • 没有类型安全的检查

二、auto关键字

1.auto的含义

使用auto修饰的变量,是具有自动存储器的局部变量
在C++11中,auto不再是一个存储类型指示型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得.
使用auto定义变量时,必须对其进行初始化
auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”

2.auto的使用

auto与指针和引用结合起来使用:
用auto声明指针类型时,用auto和auto*没有任何区别,但是auto声明引用类型时则必须为&
代码如下(示例):

int main()
{
  int x=10;
  auto a=&x;
  auto* b=&x;//第二和第三行的代码意义相同
  auto& c=x;//引用
}

auto不能推导的场景

1.auto不能作为函数的参数
代码如下(示例):

void TestAuto(auto a)
{
....
}

编译器无法对a的实际类型进行推导
2.auto不能直接用来数组
3.为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法。

3.基于范围的for循环(C++11)

for循环后的括号由冒号“:”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围
代码如下(示例):

void TestFor()
{
  int array[]={1,2,3,4,5};
  for(auto& e:array)
    e*=2;
  return 0;
  //自动遍历,依次取出array中的元素,赋值给e,直到结束
}

三.指针空值nullptr(C++11)

在c++98中,NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
在这里插入图片描述
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量,这样的设定,就会不可避免的遇到一些麻烦。
代码如下(示例):

void f(int)
{
   cout<<"f(int)"<<end1;
}
void f(int*)
{
   cout<<"f(int*)"<<end1;
}
int main()
{
   f(0);
   f(NULL);
   f((int*)NULL);
   return 0;
}

程序本意是想通过(NULL)调用指针版本(int*)函数,但是由于NULL被定义为0,所以与程序的初衷相悖。
注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

总结

到这里C++的初步入门已经结束了,下次就是类和对象的学习了,大家加油呀。我也会尽量快点更新的,都看到这里,不关注一下嘛?只要动动你的小手指。在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值