自动类型推导

在c++11中我们可以使用 auto自动推导变量的类型,还可以结合declttype来表示函数的返回值

一、auto关键字

(一)auto的推导规则

在c++11中auto并不代表一种实际的数据类型只是一个类型声明的"占位符"

  • auto在使用时必须对auto声明的变量初始化,从而让编译器推导出他的示例类型,在编译时自动将auto替换为真正的数据类型

auto 变量名 = 变量值;

#include <iostream>
using namespace std;
void test(){
    auto x=10;
    auto y="hello world";
    auto z=true;
    cout<<typeid(x).name()<<endl;
    cout<<typeid(y).name()<<endl;
    cout<<typeid(z).name()<<endl;
    int temp =20;
    auto *a = &temp;
    auto b=&temp;
    cout<<typeid(a).name()<<endl;
    cout<<typeid(b).name()<<endl;
}


int main() {
    test();
    system("pause");
    return 0;
}

  • auto可以和指针、引用结合起来使用 也可以带上 const 、volatile限定符
    • 当变量不是指针或者引用类型时,推导的结果不会保留 const volatile关键字
    • 当变量是指针或者引用类型时,推导的结果会保留 const volatile关键字
int tmp = 250;
const auto a1 = tmp; //const int*
auto a2 = a1;
const auto &a3 = tmp;//const int*
auto &a4 = a3;  //const int*
/*变量a1的数据类型为 const int,因此auto关键字被推导为 int类型
变量a2的数据类型为 int,但是a2没有声明为指针或引用因此 const属性被去掉, auto被推导为 int
变量a3的数据类型为 const int&,a3被声明为引用因此 const属性被保留,auto关键字被推导为 int类型
变量a4的数据类型为 const int&,a4被声明为引用因此 const属性被保留,auto关键字被推导为 const int类型*/


(二)auto的限制

  • 不能作为函数的参数使用。因为只有在函数调用的时候才会给函数参数传递参数,auto要求必须给修饰的变量赋值,因此二者矛盾。
  • 不能用于类的非静态成员变量的初始化(类的非静态成员是不属于类的是属于实例化对象的)
  • 不能使用auto关键字定于数组
  • 无法使用auto推导出模板参数

(三)auto的应用

  • 用于STL容器的遍历
#include <iostream>
using namespace std;
#include <vector>
void test01(){
    vector<int>v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    for(auto it=v.begin();it!=v.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
}


int main() {
    test01();
    system("pause");
    return 0;
}

  • 用于泛型编程
#include <iostream>
using namespace std;
class A1{
public:
    static int get(){
        return 100;
    }
};
class A2{
public:
    static string get(){
        return "我被调用了";
    }
};
template<typename T>
void function( ){
    auto val =T::get();
    cout<<"val:"<<val<<endl;
}

int main() {
    function<A1>();
    function<A2>();
    system("pause");
    return 0;
}

二、decltype

在不需要或者不能定义变量,但是希望的到某种类型,这时候可以适应decltype关键字,它的作用是在编译器编译时推导出一个表达式的类型

语法:decltype (表达式)

#include <iostream>
using namespace std;
void func(){
    int a = 100;
    decltype(a) b=99;
    decltype(a+1.2) c=101.2;
    decltype(a+b*c) d=1993.52;
    cout<<"a:"<<a<<endl;
    cout<<"b:"<<b<<endl;
    cout<<"c:"<<c<<endl;
    cout<<"d:"<<d<<endl;
}
int main(){
    func();
    system("pause");
    return 0;
}

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值