auto
在C++11中,语法变得更加“智能化”,编译器会替你完成更多的工作,auto这个关键字会替你自动推导出变量的类型。
int a = 2;
auto b = a; //推导出b的类型是int
上面是最基本的用法,还有更高级的。
int ra = 2;
int* a = ra;
auto b = a; //推导出b的类型为int*
auto& c = ra; //推导出c是ra的引用
不过auto的更大用途不是这个,而是在<map>中推导出很复杂的类型。
- 注意:
以下几点是错误用法
auto a[] = {1,2,3};//不能推导数组类型
void Func(auto a);//不能推导形参类型
nullptr
我们都知道在C语言中,用NULL表示空指针,但在C++11中,更推荐用nullptr来表示空指针。
void Func(int n)
{
cout << "int" << endl;
}
void Func(int* n)
{
cout << "int*" << endl;
}
//两个重载函数,会输出传入参数的类型
int main()
{
Func(0);
Func(NULL);
Func(nullptr);
return 0;
}
猜猜看,main函数中的三个调用会自动匹配哪个重载函数?
结果是
int
int
int*
这时候就有同学发出疑问,NULL不是空指针吗,为什么会匹配到int上去?因为C++只是对NULL进行的宏定义,
#define NULL 0
所以部分情况下,NULL会被解释为int型的0,而非空指针。
C++引入的nullptr来更好的替换空指针。
因为nullptr相当于
#define nullptr (void*)0
所以C++中更推荐用nullptr表示空指针。
for的语法糖
大家肯定对for循环很熟悉了,如下面这个数组,
int a[] = {1,2,3,4};
那么,我想遍历数组,让数组每个值变成2倍,然后打印,怎么办呢?It is easy。
for(int i = 0; i < sizeof(a)/sizeof(int); ++i)
{
i *= 2;
cout << a[i] << " " << endl;
}
但是C++11中给出了更爽的写法。
for(int e : a)
{
e *= 2;
cout << e << " " << endl;
}
将数组a中的每一个值赋给e,然后对e实现下面的操作。
编译器会自动识别数组的大小,不用我们计算。
但是结果与我们想的有一点不一样,
1 2 3 4
没有乘上2,这是什么原因呢?
因为我们是对e进行的操作,不关a数组的事,那么怎么办呢?
我们这样,
for(int& e : a)
{
e *= 2;
cout << e << " " << endl;
}
还有下面这种更高级的做法,不用担心数组被改,
for(auto& e : a) //自动推导
{
e *= 2;
cout << e << " " << endl;
}
- 注意:
for括号的第二个参数只能是数组,不能是指针,
void Func(int* a)
{
for(auto& e : a)
{
e *= 2;
cout << e << " " << endl;
}
}
如果我们将main中的a数组作为实参传过去,编译器会报错,因为数组传过去就会退化为指针,而指针是不行的。
(全文完)