c++ 11 声明

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 ——— 如果编译器支持它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值