c++11_14学习之-面向安全编程

一、无异常保证

noexcept
void function() noexcept{}函数不抛出任何异常,减少异常处理的成本,提高运行效率

二、内联名字空间

inline namespace temp{
	int xx = 0;
}
assert(xx==0);//无需名字空间限制,可直接访问

namespace release{
	namespace v001{
		void func(){}
	}
	inline namespace v002{
		void func(){}
	}
}
release::func();//调用v002版

多个子命名空间对外只暴露一个,很好的隔离版本间的差异,利于维护

三、强制枚举类型

c++中的枚举是弱类型,相当于整数,c++11/14可以用enum class/struct的形式声明强类型引用,它不能被隐式转换为整形,使用也必须使用类型名限定访问枚举值,就像类的静态成员一样
还使用char、int 等,指示枚举使用的整数类型

enum class color:char{}//枚举使用char类型存储
enum {
	red=1,green=2,blue=3
};
assert(red == green-1);
int red = 1;
enum class color{...}
auto x = color::red;
auto y = red; //错误必须添加限定名
auto z = color::red -1; //错误不能隐式转换成整形

四、属性

[[attribute]]标记编译特征,指示编译器做某种程度的优化

[[deprecated]] int x = 0; //x已经被废弃
class [[deprecated]] demo{};//demo 已经被废弃

五、语言版本

宏__cplusplus是个整形常数
199711L c++98/03
201103L c++11
201402L c++14
可用于条件编译的判断逻辑

#if __cplusplus < 201103L
	#error ""
#endif

六、超长整形

long long 至少是64位
LL/ll ULL/ull/uLL显示说明整形是long long

auto a = 11111LL;
auto b = 2222222ULL;

七、原始字符串

R"(…)"

string s = R"(this is a "\string\")";
cout<<s<<endl;//this is a "\string\"保留原始字符串,而对" \不做转义
auto reg = R"(^\d+\s\w+)";//相当于"^\\d+\\s\\w+"

还支持最多16个字符的delimiter,()两边必须相同,且不能是@ $ \等特殊字符

a = R"***(dark souls)***";

八、自定义字面值

字面值需要重载"“函数名必须以_开头
return_type operator”" _suffix(unsinged long long );

long operator"" _kb(unsigned long long v)
{return v * 1024;}
auto x = 2_kb;
assert(x==2*1024);实际值20148

c++14增加的自定义字面值
h/min/s/ms

auto t1 = 2min;//2分钟
auto t2 = 30s;//30秒
auto s = "std string type"s;//标准字符串,不是秒

七、其他

1、右尖括号
“>>“优先解释为模板,而不是按位右移
2、函数的默认模板参数
模板函数可以使用默认参数
3、增强联合体
可以有构造/析构函数和成员函数,但是不能有虚函数和引用成员
4、二进制字面值
0b /0B直接书写二进制数字

你可能感兴趣的:(c++,c++,学习,开发语言)