C++11新特性之新类型与初始化

这是C++11新特性介绍的第一部分,比较简单易懂,但是也有一些有趣的地方。
不想看toy code的读者可以直接拉到文章最后看这部分的总结。

新类型

long long类型

C++11标准中新加入了long long类型属性,占用空间不小于long类型。测试代码如下:

在我的机器上实测,long long类型和long类型同样使用64bit空间。

nullptr字面量

C++11标准中专门为空指针增加了nullptr字面量,同时不推荐再使用NULL或者0表示空指针。

最终测试结果,nullptr和NULL和0是一样的。

constexpr

C++11标准中新增constexpr用于声明常量表达式,编译器会验证此变量的值是否是一个常量表达式。

值得注意的是,constexpr指针可以指向非常量变量,只要此变量定义于函数之外,因为这样的变量的指针(地址)是可以在编译期确定的。
另外,下面的constexpr指针与const指针的含义是完全不同的:

第一个指针表示一个常量指针,即指针的值是常量;而第二个指针表示一个指向const int的指针,即指针指向的值是常量。

constexpr还可以用于函数,constexpr函数是指能用于常量表达式的函数,它遵循以下几条约定:

a.返回类型是字面值类型
b.形参类型是字面值类型
c.函数体中必须有且仅有一条return语句

noexcept

noexcept可以用作异常指示符,用于指示一个函数是否会抛出异常。编译器并不检查使用了noexcept的函数是否真的不抛出异常,在运行时,如果一个使用noexcept承诺不抛出异常的函数实际抛出了异常,那么程序会直接终止。

noexcept还可以带参数,noexcept(true)表示不会抛出异常,noexcept(false)表示可能抛出异常。
同时noexcept还可以用作运算符,接受一个函数调用,返回一个bool值表示是否会抛出异常。noexcept运算符并不会对其实参进行求值。
将noexcept运算符,结合带参数的noexcept指示符,可以得到如下常用法:

这种用法表示no_except2和no_except的异常说明保持一致。

初始化

列表初始化

C++11新标准中为很多类型增加了列表初始化的功能。
可以用列表初始化一个简单变量。

可以用列表初始化一个容器(vector,list,map,set…)。

可以在使用new动态分配内存时使用列表初始化。

可以在传入参数/函数返回值时使用列表初始化。

类内成员初始化

C++11标准中允许直接对类内成员进行初始化/列表初始化。

总结

  1. long long类型。
  2. nullptr字面量用于表示空指针。
  3. constexpr用于表示常量表达式。
  4. noexcept可以用于指示一个函数是否会抛出异常,同时可以用作运算符判定一个函数是否承诺不抛出异常。
  5. 新增基础类型、容器类型、new分配内存时的列表初始化。构建临时变量时也可以直接使用列表初始化。
  6. 可以直接对类内成员进行初始化/列表初始化。

完整代码详见new_type_and_keywords.cppinitialize.cpp

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 5 收藏 评论

关于作者:usher2007

游戏开发 C/C++ Python Linux 个人主页 · 我的文章 · 9 ·    

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部