引入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;
}