新特性(1)---nullptr,auto

引入nullptr的原因

c中的null

在c语言中,我们常常会使用null;代表一个空指针,表示指针不指向任何对象。NULL是一个宏定义,定义如下:

#define NULL ((void *)0)

在使用中通过隐式转换,将空指针转换为其他类型的指针。如下将void *转换为int *
在c中,也支持将null定义为整型0

int *p=NULL;

c++中的null

在c++中,不允许指针的隐式转换。而为了解决空指针的问题,所以在c++中null定义为整型0;

#define NULL 0

0代表一个空指针,null就是0,但是在c++程序中常常用到重载,就会产生一些二义性问题。

void f(int);
void f(void *);//重载f函数

f(NULL)//执行f,调用那个函数???

事实上调用的是第一个函数正如上面所说的c++中null代表整型0,但是真实开发中null同时代表空指针会使我们误以为调用了第二个函数。所以nullptr由此诞生。

nullptr

nullptr是一个新的关键字。它可以自动转换为各种指针类型。但不允许转换为整型类型。
这样在上面的栗子中,就可以明确知道调用的是第二个函数

void f(int);
void f(void *);//重载f函数

f(nullptr)//执行f,调用那个函数???

auto

c++11允许你申明一个变量或者对象,而不需要指明他的类型。只需要说他说auto。(自动转换不限于int double等,也可以转换为指针等 auto p=&x)
但是必须先进行初始化操作,栗子:

auto i=10;//int
double f();
auto d=f();//double

在真正编程的时候也不建议这样来使用auto,直接写出变量的类型更加清晰易懂。但在使用代替冗长复杂、变量使用范围专一的变量时候或者表达式很复杂的时候,使用auto能够简化代码。例如:

vector<string > v;
.....
auto pos =v.begin();
vector<string>::iterator pos2=v.begin();//两者相同简化代码

在使用模版的时候,可以声明依赖模板参数的变量类型

template <typename x,typename y>
void test(x x1, x y1)
{
    auto v = x1*y1;
    cout << v;
}

猜你喜欢

转载自blog.csdn.net/qq_35651984/article/details/83049277
今日推荐