首页 > 编程语言 >C++auto关键字

C++auto关键字

时间:2024-01-23 12:13:07浏览次数:25  
标签:变量 推导 int auto C++ 关键字 编译器 类型

auto用来干啥

在C语言中,auto是用来修饰局部变量的,意味着该变量在该代码块内要有效,出代码块自动销毁

但是在C++中,有了新的用法:自动推导变量类型

int a = 10;
auto b = a; //自动推导b的类型为a的类型(整形)
auto c = 'c';//自动推导c的类型为字符型
auto sum = Add(a,b);//自动推导sum的类型为函数的返回值类型

/* 分别打印变量类型的名字 --- typeid()*/
cout<<typeid(b).name<<endl;
cout<<typeid(c).name<<endl;
cout<<typeid(sum).name<<endl;

当然auto的使用场景不限于此

auto的使用场景

基于范围的for循环

通常在写for循环的时候,需要我们自己标注好循环的范围

但是有时会犯错误,C++因此引入了范围for循环

for循环后的括号由冒号分为两部分:第一部分是范围内用于迭代的变量, 第二部分则表示被迭代的范围.

int arr[]={1,2,3,,4,5,6,7,8};
for(auto e : arr)
{
    cout<<e<<" ";
}
//自动依次取 arr的元素赋值给e

这样,不管数组元素的类型是什么,都会自动打印每一个元素

注意:范围for循环什么时候不能用

for循环的迭代返回必须是确定的,对于数组而言,就是第一个元素到最后一个元素

比如:

void test(int arr[])
{
    for(int e:arr)
    {
        cout<<e<<" ";
    }
}
// 数组形参其实就是首元素地址,而非整个数组
// 所以此时迭代找不到范围,出错!

自动推导变量类型

如果变量的类型特别长,那么写起来就很麻烦
这时候就体现出来auto的价值了

举个例子:

std::map<std::string,std::string>::iterator it = dict.begin()

就可以替换成:auto it = dict.begin()

auto的使用细节

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

auto与指针:autoauto*一样

auto与引用:auto&

 int x = 10;
auto a = &x;//自动推导a是int*
auto* b = &a;//auto* 表明b是一个指针,这时候右边必须传指针
auto& c = x;// 表明c是一个引用(别名),自动推导c的类型为int

这样就可以利用范围for来修改数组元素了

//利用引用,e就是每一次该元素的别名,利用别名进行修改元素
for(auto& e : arr)
{
    e++;//每个元素++
}

*********************************************

//利用指针可以吗?--不可以!
for(auto* e:arr)
{
    *e? 
}
/* 注意:范围for是不可以用指针的
因为范围for是把数组的每一个元素传递
只能用传值接受和传引用接收,指针不识别*/
  1. 在同一行定义多个变量

最好不用auto一行定义多个,如果多个变量的类型存在不同,是无法识别的!

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

auto a = 10, b = 30; // 这样可以识别
auto c = 10, d = 30.0;// 一个是int,一个是double。无法识别

注意

使用auto定义变量时必须对其进行初始化,因为在编译阶段,编译器就会根据后面初始化给的值来推导出auto的类型。并在编译期间就会把auto替换为变量的实际类型

auto不能使用的场景

  1. auto不能作为函数参数
//此时代码编译会出错,auto不能作为形参类型
//因为编译器无法推导出形参的实际类型
void test(auto a)
{
    /***/
}

准确点来说,函数调用需要开辟栈帧。而编译器给函数开辟栈帧之前就已经根据形参、函数体里的开辟的空间的大小算好要开辟的栈帧大小了。而auto的形参对于编译器来说,不知道要开辟多大的空间。所以会报错

  1. auto不用来声明数组
void test()
{
    int a[]={1,2,3};
    auto b[]={4,5,6};
    //编译器无法自动推导数组的类型
}

标签:变量,推导,int,auto,C++,关键字,编译器,类型
From: https://www.cnblogs.com/iiianKor/p/17982025

相关文章

  • C++引用 | 什么是引用
    引用我们知道C语言以指针著名C++大佬在发明C++的过程中,觉得指针有些难,就发明了引用引用是什么?引用并不是定义一个新的变量,而是给一个已存在的变量取一个别名.编译器不会给引用变量开辟内存空间,这个别名和它引用的的变量(原变量)共用同一块内存空间简单来说就是:......
  • C++函数重载探究
    函数重载什么是函数重载简单来说,就是可以有多个相同函数名的函数,但是这些函数的参数个数 或者参数类型或者参数的类型顺序 是不一样的.通常来处理类似的功能,但是数据个数或者类型不同的情况如:计算器就是一个例子,加法可以是任何个数任何类型的数的加法但是都只......
  • 详解static关键字在Java中的各种适应场景,这个很重要!
    写在开头静态(static)关键字在Java的众多关键字中举足轻重!也是很多大厂面试官特别喜欢问的面试高频知识点,今天我们就一起学习,梳理,重温一下这个关键吧,之所以用重温修饰是因为在过往的文章中早已提到了static,无论是变量中还是方法中甚至于类中,static都是不可或缺的!我们知道要想调用......
  • C/C++可变参数函数
    C可变参数typedefchar*va_list;voidva_start(va_listap,prev_param);typeva_arg(va_listap,type);voidva_end(va_listap);//32位机器对int大小向上取整,64位机器对int64大小向上取整,因为参数在栈中传递都要对齐#define_INTSIZEOF(n)((sizeof(n)+si......
  • C++类和对象-对象特性(2)
    一.构造函数的分类及调用两种分类方式:按参数分为:有参构造和无参构造按类型分为:普通构造和拷贝构造三种调用方式:括号法显示法隐式转换法二.拷贝构造函数调用时机拷贝构造函数调用时机C++中拷贝构造函数调用时机三种情况使用一个已经创建完毕的对象来初始化一个新......
  • 19.PG的autovacuum
    autovacuum时启动postgresql时自动启动的后台实用程序进程之一参数:autovacuum =on(默认开启)  track_counts=on(默认开启)作用:1)需要vacumm来移除死元组2)防止死元组膨胀 3)更新表的统计信息进行分析,以便提供优化器使用4)autovacuumlauncher使用stats......
  • C++学习笔记
    C++学习笔记(1)预编译、编译、链接预编译(Preprocessing)cppreference中:GPT这么说:C++预编译是指在编译阶段之前对代码进行的一系列预处理操作。预编译的目的是为了将代码中的预处理指令和宏展开,以及进行一些其他的预处理操作。预处理指令包括以井号(#)开头的指令,如#include、#......
  • C++日志记录库spdlog
    镜像库https://gitee.com/yctxkj/spdlog.gitspdlog是基于C++11实现的一款纯头文件的日志管理库(git地址:https://github.com/gabime/spdlog,API说明:https://spdlog.docsforge.com/v1.x/1.quickstart/):配置特别简单,仅包含头文件即可;写日志方式简单明了;可实现自动按日期创建日志文......
  • KY85 二叉树C++
    递归判断当前节点和n的关系就好了。如果小于等于n那就是存在。#include<iostream>usingnamespacestd;intcount(inti,intn){if(i>n)return0;returncount(2*i,n)+count(2*i+1,n)+1;}intmain(){intn,m;while(cin>>m>>n){if(n==0)......
  • 如何备份已经安装并设置AutoHotkey脚本编程环境的Windows电脑系统分区 2024.01.22
     如何备份已经安装并设置AutoHotkey脚本编程环境的Windows电脑系统分区2024.01.22第1步:邮购并制作银灿IS903可启动U盘,量产Emulation-CD-ROM所用ISO镜像选用从www.firpe.cn下载的PE光盘镜像。第2步:正确安装电脑软件并调整电脑各项设置备份硬盘分区表和启动扇区信息转移个......