C++_12——新特性(一些类型、关键字、表达式)

C++_12——新特性(一些类型、关键字、表达式)

  1. char16_t / char32_t
char16_tchar32_t
无符号,长16位无符号,长32位
前缀u前缀U
  1. size_t

    1. size_t在不同架构下的定义不同。
    2. 32位系统下一般定义为unsigned int ,占4字节;64位系统下一般定义为unsigned long,占8字节。
    3. size_t方便移植程序,如计数等操作,保证能容纳实现所建立的最大对象的字节大小。
  2. long longunsigned long long

  3. 原始字符串 raw string

    1. 原始字符串将保证字符串内容不加修改地输出,转义字符将以两个常规字符的形式表示。
    2. 方法是使用定界符 "()" 并通过前缀R来表示原始字符串,如下:
    	std::cout<<R"(aaa "bbb" ccc"\n")"<<std::endl;
    	//输出:  aaa "bbb" ccc"\n"
    
    1. 如果字符串内容中包含 )" ,当编译器见到第一个 )" 时,会认为字符串结束,就会造成错误。解决方法是定义一个特殊的定界符,规则是在引号与括号之间增加任意字符,同时保证首尾增加的字符是一样的,如下:
    	std::cout<<R"+6(aaa "bbb" ccc"\n")+6"<<std::endl;//这里定义了 "+6( 和 )+6" 的定界符,其中增加了+6这些字符
    	//输出:  aaa "bbb" ccc"\n"
    

    当然,任意字符,不包括空格、左右括号、斜杠、控制字符(制表符、换行符等)。

  4. autodecltype

    1. auto,自动类型推断,要求显示初始化,使得编译器能够将变量类型设置成初始值类型。一般用于复杂类型,在模板中常见,对于简单数据类型容易误用。
    2. 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;
    		//...
    	}
    
  5. 作用域内枚举

    1. 对于下面的情况,在同一个作用域内定义相同的枚举量,会出现冲突
    	enum egg {Small, Medium, Large};
    	enum apple {Small, Medium, Large};
    
    1. 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;
    
    1. 常规枚举能够实现整型提升,但作用域内的枚举不能隐式转换为整型。
    2. 作用域内枚举的底层类为int,可以通过下述方式,修改底层类型,底层类型必须为整型。
    	enum class : short egg{Small, Medium, Large};
    
  6. constexpr

    1. 对比const
      const仅修饰变量,被其修饰的变量只能被初始化,不能被修改,可以在编译期指定初始化值,也可以在运行时指定。
      constexpr可以修饰变量和函数,在修饰变量时,该变量是编译期常量(在编译期就算出来),在修饰函数时,要保证函数返回值与参数在编译期就能算出来,(C++11要求return有且只能有一行代码,C++14取消该要求),否则就是一个普通函数。
    2. C++干货系列——从编译期常量谈到constexpr
    3. constexpr鼓励编译器做编译期优化。
  7. 列表初始化

    1. c++11使用大括号作为一种通用的初始化方法,以此代替不同变量的不同初始化方式(比如初始化普通变量、结构变量、类变量等)。
    	int a{7}int b{}//没有值意味着b被初始化为0
    	double c[2] {1,2};
    	int* d = new int[3] {1,2,3};
    	//...
    
    1. 列表初始化不允许缩窄(如禁止使用浮点数初始化整型数组),不允许大括号内使用变量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值