C++11学习笔记01

语言新特性
.__cplusplus 宏
.对齐支持 
.通用属性 
.原子操作 
.auto类型推导 
.强类型枚举 
.复制及再抛出异常 
.常量表达式 
.decltype
.函数的默认模板参数 
.显示默认和删除的函数(默认的控制) 
.委托构造函数 
.并行动态初始化和析构 
.显示转换操作符 
.扩展的friend语法 
.扩展整型 
.外部模板 
.一般化的SFINAE规则 
.统一的初始化语法和语义 
.非受限联合体 
.用户定义的字面量 
.变长模板 
.类成员初始化 
.继承构造函数 
. 初始化列表 
.lambda函数 
.局部类型用作模板参数 
.long long 整型 
.内存模型 
.移动语义 
.内联名字空间
.防止类型收窄 
.指针空值 
.POD
.基于范围的for语句 
.原生字符串面值 
.右值引用 
.静态断言 
.追踪返回类型语法 
.模板别名 
.线程本地的存储 
.Unicode 
1.__func__预定义标识符
C99标准中的__func__预定义标识符。
作用:基本功能就是返回所在函数的名字。
const char* hello(){
	return __func__; 
} 
//return:hello
const char* hello(){
	static const char* __func__ = "hello";
	return __func__;
} 
__func__预定义标识符 对于轻量级的调试代码具有十分重要的作用
C++11甚至允许其使用在类或结构体中
在结构体的构造函数中,初始化成员列表使用__func__预定义标识符是可行的,其效果跟在函数中使用一样
不过将__func__标识符作为含参数的默认值是不允许的,这是由于在参数声明时,__func__还未被定义
2._Pragma操作符
在C/C++标准中#pragma是一条预处理的指令(preprocessor directive) 
#pragma 是用来向编译器传达语言标准以外的一些信息
#pragm once 那么该指令会指示编译器(如果编译器支持),该头文件应该只被编译一次。
在C++11中,标准定义了与预处理指令#pragma功能相同的操作符_Pragma
_Pragma (字符串字面量)
3. long long 整型
long long 被纳入C++11标准
long long 和unsigned long long 两种类型
至少保证有64位
LLONG_MIX
LLONG_MAX
ULLONG_MIN 
4.静态断言
在C++中,程序员也可以定义宏NDEBUG类禁用assert宏
类似的实现
#ifdef NDEBUG
#define assert(expr)	(static_cast<void>(0)) 
#else
...
#endif

#ifndef _COMPLEX_H
#error "111111"
#endif

一旦定义了NDEBUG宏,assert宏将被展开为一条无意义的C语句(通常会被编译器优化掉)
静态断言与static_assert
断言 assert 宏只有在程序运行的时候才起作用 ,而#error只在编译器预处理时候才能起作用
 static_assert(bool表达式,"错误信息") 
 
5.noexcept 修饰符与noexcept 操作符
 
 void excpt_func() throw (int,double) {...}
 定义了一个动态异常声明throw(int,double),该声明指出excpt_func可能抛出异常的类型。
 事实上该特性很少被使用,因此在C++11中弃用,而表示函数不会抛出异常的动态异常声明
 throw()也被noexcept异常声明所取代

noexcept 形如其名,表示其修饰的函数不会抛出异常。在C++11中如果noexcept修饰的函数
抛出了异常,编译器可以选择直接调用std::terminate()函数来终止程序的运行
  
从语法上讲,noexcept修饰符有两种形式,一种是简单地在函数声明后加上noexcept关键字
void excpt_func()  noexcept;
另外一种则可以接受一个常量表达式作为参数
void excpt_func() noexcept(常量表达式);
常量表达式的结果会被转换成一个bool类型的值。值为true,表示函数不会抛出异常,反之则抛出异常
 
noexcept 作为一个操作符时候,通常用于模板
template <class T>
void fun() noexcept(noexcept(T())){}
 
虽然noexcept修饰符的函数通过std::terminate的调用来接受程序的执行可能会代来很多问题
比如无法保证对象的析构函数正常调用,无法保证栈的自动释放等
但是很多时候“暴力”的终止整个程序确实是简单有效的方法。
 
 C++11标准中让类的析构函数默认也是noexcept() 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫Devin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值