C++11新特性

C++11引入了新的初始化方式,如列表初始化,统一使用花括号。auto用于自动类型推断,简化代码。decltype能获取表达式的类型,提升安全性。nullptr作为新的空指针表示,避免了整数和指针的混淆。
摘要由CSDN通过智能技术生成

1. 列表初始化

初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值替代。(C++ Primer)

作为C++11新标准的一部分,用花括号来初始化变量得到了全面应用,这种初始化的形式被成为列表初始化。

int* a = new int { 3 };
double b = double{ 12.12 };
int * arr = new int[] {1, 2, 3};

无论是类的变量,数组,stl的容器,类的构造,都统一使用{},以后只要是初始化就首先考虑{}的初始化就OK了。
2、C++11新的声明

2.1 auto

C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。
例如:

int main()
{
    int i = 10;
    auto p = &i;
    auto pf = strcpy;
    cout << typeid(p).name() << endl;
    cout << typeid(pf).name() << endl;
    map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
    
    //map<string, string>::iterator it = dict.begin();
    auto it = dict.begin();
    return 0;
}

使用auto可以使代码写起来更加的简单、便捷。

2.2 decltype

关键字decltype将变量的类型声明为表达式指定的类型。

例如:
// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{
    decltype(t1 * t2) ret;
    cout << typeid(ret).name() << endl;
}
int main()
{
    const int x = 1;
    double y = 2.2;
    decltype(x * y) ret;         // ret的类型是double
    decltype(&x) p;             // p的类型是int*
    cout << typeid(ret).name() << endl;
    cout << typeid(p).name() << endl;

    int z = 0;
    decltype(z) tmp;

    cout << typeid(tmp).name() << endl;
    F(1.1, 1.1);
    return 0;
}

2.3 nullptr

由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。

#ifndef NULL
#ifdef __cplusplus
#define NULL  0
#else
#define NULL  ((void *)0)
#endif
#endif
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值