【C++杂货铺】内联函数、auto、范围for、nullptr(二)

简介: 【C++杂货铺】内联函数、auto、范围for、nullptr(二)

2.2 auto使用细则

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

 用auto声明指针类型时,用auto和aauto*没有任何区别,但是auto声明引用类型时,必须要加&,如下,如果c不加&的话,就是x的一份拷贝。

int main()
{
  int x = 10;
  auto a = &x;//根据右边推出,a是一个指针类型
  auto* b = &x;//右边必须是一个地址,因为前面加了*
  auto& c = x;//引用必须要加&
}

🪆在同一行定义多个变量

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

int main()
{
  auto a = 10, b = 30;
  auto c = 60, d = 1.1;//该行编译失败,c和d的初始化类型不同
}

953bd56a83394609bac0dc8af9125339.png

2.3 不能使用auto的场景

  • auto不能作为函数的参数
//错误,编译器无法对x的实际类型进行推导
void Text(auto x)
{}

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

void Text()
{
  //auto arr[] = { 1, 2, 3 };//错误写法,请勿模仿
  int arr[] = {1, 2, 3}//这才是正确写法
}

小Tips:auto在实际中常被用在:基于范围的for循环中、还有lambda表达式中、其次就是一些非常非常长的类型,也会用auto进行替换。

三、基于范围的for循环

🪆C++98中遍历一个数组:

void TestFor()
{
  int array[] = { 1, 2, 3, 4, 5 };
  for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)//通过下标访问
      array[i] *= 2;
  for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)//通过指针访问
      cout << *p << endl;
}

🪆C++98中遍历一个数组:

 对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还容易犯错误。因此C++11中引入了基于范围for循环。for循环后的括号由冒号“ : ”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

void TestFor()
{
  int array[] = { 1, 2, 3, 4, 5 };
  for(auto& e : array)//加引用可以对后面的值修改
      e *= 2;
  for(auto e : array)
      cout << e << " ";
  return 0;
}

3.1 范围for的使用条件

  • for循环迭代的范围必须是确定的
  • 迭代的对象要实现++和==的操作

 对数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end方法,begin和end就是for循环的迭代范围。范围for本质上是迭代器,支持迭代器就支持范围for。

void Text(int arr[])//arr本质上只是一个地址,没有范围
{
  for (auto a : arr)//错误
  {
    cout << a << endl;
  }
}

四、指针空值nullptr

 良好的编程习惯要求我们,在声明一个变量时最好给该变量一个合适的初始值,否则可能出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们一般会把它置空。

🪆回顾NULL:

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

d585f58254c14dc48d39cac52400b44a.png

上述代码的本意是:希望通过f(NULL);去调用void f(int*),但是通过执行结果可以看出,f(NULL);调用的是void f(int)。这是因为NULL被定义成了0,且C++98中规定,字面常量0,既可以是一个整型数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成一个整型常量,如果要将其按照指针的方式来使用,必须对其进行强制类型转换(void*)0。

ac66fca4285a44759d3160111a410e87.png

🪆认识nullptr:

 nullptr用来表示指针空值,因为nullptr是C++11作为新关键字引入的,所以在使用的时候不需要包头文件。C++11中,sizeof(nullptr)和sizeof((void*)0)所占字节数相同。

int main()
{
  cout << sizeof(nullptr) << endl;
  cout << sizeof((void*)0) << endl;
  return 0;
}


32e857e6842d42f3907a0a2f1c05552a.png

 今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是春人前进的动力!

目录
相关文章
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
安全 程序员 编译器
C++ 11新特性之auto和decltype
C++ 11新特性之auto和decltype
37 3
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
23天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
23天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
20 4
|
23天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
51 1