C++_12——新特性(一些类型、关键字、表达式)
- char16_t / char32_t
char16_t | char32_t |
---|---|
无符号,长16位 | 无符号,长32位 |
前缀u | 前缀U |
-
size_t
- size_t在不同架构下的定义不同。
- 32位系统下一般定义为unsigned int ,占4字节;64位系统下一般定义为unsigned long,占8字节。
- size_t方便移植程序,如计数等操作,保证能容纳实现所建立的最大对象的字节大小。
-
long long 和 unsigned long long
-
原始字符串 raw string
- 原始字符串将保证字符串内容不加修改地输出,转义字符将以两个常规字符的形式表示。
- 方法是使用定界符 "( 和 )" 并通过前缀R来表示原始字符串,如下:
std::cout<<R"(aaa "bbb" ccc"\n")"<<std::endl; //输出: aaa "bbb" ccc"\n"
- 如果字符串内容中包含 )" ,当编译器见到第一个 )" 时,会认为字符串结束,就会造成错误。解决方法是定义一个特殊的定界符,规则是在引号与括号之间增加任意字符,同时保证首尾增加的字符是一样的,如下:
std::cout<<R"+6(aaa "bbb" ccc"\n")+6"<<std::endl;//这里定义了 "+6( 和 )+6" 的定界符,其中增加了+6这些字符 //输出: aaa "bbb" ccc"\n"
当然,任意字符,不包括空格、左右括号、斜杠、控制字符(制表符、换行符等)。
-
auto 与 decltype
- auto,自动类型推断,要求显示初始化,使得编译器能够将变量类型设置成初始值类型。一般用于复杂类型,在模板中常见,对于简单数据类型容易误用。
- decltype,将变量声明为表达式指定的类型。
int y; decltype(y) x; //定义x,使x的变量类型与y相同
对于模板来说,只有实例化之后才能确定类型,因此decltype常用。
template <typename T, typename U> void ef(T t , U u) { decltype(T*U) tu; //... }
-
作用域内枚举
- 对于下面的情况,在同一个作用域内定义相同的枚举量,会出现冲突
enum egg {Small, Medium, Large}; enum apple {Small, Medium, Large};
- C++11提供了一种新枚举,枚举量的作用域为类或结构体,使用枚举名来限制枚举量
enum class egg {Small, Medium, Large}; enum class apple {Small, Medium, Large}; enum struct peach {Small, Medium, Large}; enum struct box {Small, Medium, Large}; egg s = egg::Small;
- 常规枚举能够实现整型提升,但作用域内的枚举不能隐式转换为整型。
- 作用域内枚举的底层类为int,可以通过下述方式,修改底层类型,底层类型必须为整型。
enum class : short egg{Small, Medium, Large};
-
constexpr
- 对比const
const仅修饰变量,被其修饰的变量只能被初始化,不能被修改,可以在编译期指定初始化值,也可以在运行时指定。
constexpr可以修饰变量和函数,在修饰变量时,该变量是编译期常量(在编译期就算出来),在修饰函数时,要保证函数返回值与参数在编译期就能算出来,(C++11要求return有且只能有一行代码,C++14取消该要求),否则就是一个普通函数。 - C++干货系列——从编译期常量谈到constexpr
- constexpr鼓励编译器做编译期优化。
- 对比const
-
列表初始化
- c++11使用大括号作为一种通用的初始化方法,以此代替不同变量的不同初始化方式(比如初始化普通变量、结构变量、类变量等)。
int a{7}; int b{}; //没有值意味着b被初始化为0 double c[2] {1,2}; int* d = new int[3] {1,2,3}; //...
- 列表初始化不允许缩窄(如禁止使用浮点数初始化整型数组),不允许大括号内使用变量。