C++11中的几个语法

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[] = {1234};

那么,我想遍历数组,让数组每个值变成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数组作为实参传过去,编译器会报错,因为数组传过去就会退化为指针,而指针是不行的。
(全文完)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值