码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 11 声明

时间:2015-07-28 21:04:42      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

1. auto

c++11将其用于实现自动类型推断。这要求进行显示初始化,让编译器能够将变量的类型设置为初始值的类型。

auto maton = 112;  // maton is type int

auto pt = &maton; //pt is type int *

double fm(double, int);

auto pf = fm;   //pf is type double (*) (double, int)


关键字auto还可以简化模板声明。 例如,如果i1是一个std::initializer_list<double> 对象, 则可将下述代码:

for (std::initializer_list<double>::iterator p = i1.begin(); p != i1.end(); p++ )

替换为如下代码:

for (auto p = i1.begin(); p != i1.end(); p++)


2.decltype

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

decltype(x) y;  //x 是表达式, 该语句让y的类型与x相同。

double x;

int n;

decltype(x*n) q; // q的类型与x*n相同, 为double

decltype(&x) pd; //pd 的类型和&x相同, 为double *

这在定义模板时特别有用, 因为只有等到模板被实例化时才能确定类型:

template <typename T, typename u>

void ef(T t, U u)

{

decltype(T*U) tu;

...

}

tu的类型为T*U的类型, 假定定义了运算T*U, 如果T为char,U为short, 则tu将为int, 这是由整形运算自动执行整型提升导致。


3.模板别名: using = 

对于冗长或复杂的标识符,如果能够创建其别名将很方便。 以前,c++为此提供了 typedef;

typedef  std::vector<std::string>::iterator;

c++11提供了另一种创建别名的语法:

using  itType = std::vector<std::string>iterator;

差别在于, 新语法可以用于模板部分具体化,但typedef不能:

template<typename  T>

using arr12 = std::array<T,12>;

上述 语句具体化模板 array<T, int>, 例如:

std::array<double, 12>  a1;

std::array<std::string, 12> a2;

可将他们替换为如下声明:

arr12<double> a1;

arr12<std::string> a2;


4. nullptr

空指针是不会指向有效数据的指针。c++11新增了关键字nullptr, 用于表示空指针, 它是指针类型, 不能转换为整数类型。 为向后兼容c++11仍允许使用0来表示空指针, 因此表达式 nullptr == 0 为true, 但使用nullptr而不是0提供了更高的类型安全。 例如, 可将0传递给接受int 参数的函数, 但如果你试图将nullptr传递给这样的函数, 编译器将此视为错误。 因此, 出于清晰和安全考虑, 请使用nullptr ——— 如果编译器支持它。

版权声明:本文为博主原创文章,未经博主允许不得转载。

c++ 11 声明

标签:

原文地址:http://blog.csdn.net/nizhannizhan/article/details/47110465

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!