More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. daily
  3. 正文

Daily C/C++ 新版本C++中的易用性改进(2)

2021年8月29日 513点热度 0人点赞 0条评论

Daily C/C++ 新版本C++中的易用性改进

参考文章

自定义字面量,这个平常用的相对较少,这里就简单提一嘴

我们可以自己定义字面量,只需要我们重载operator""即可

这里举个例子

length operator"" _m(long double v)
{
  return length(v, length::metre);
}

length operator"" _cm(long double v)
{
  return length(v, length::centimetre);
}

自定义字面量的要求就是后缀要以下划线开头,比如这里写出的两个重载,我们就可以使用类似1.1_m,0.5_cm的字面量

返回的自然是对应类型的对象了,参数就是后缀前面的具体的值

然后就是C++14支持了二进制的字面量

以0为前缀是八进制,0x是十六进制,0b则是二进制

静态断言,在C++11支持了静态的assert机制。曾经的assert是针对运行时判断的,而这里C++支持在编译期检查一个条件是否成立

用法也很简单,就是static_assert(condition, message)即可

然后是对于类中的特殊成员函数的修饰

编译器有时会默认提供一些成员函数,比如拷贝构造函数,移动构造函数等。但是如果这时候我们不想要编译器默认提供的,比如一个类不支持拷贝。曾经的做法是定义一个noncopyable的类,把他的拷贝构造函数和拷贝赋值函数放到private中,再让我们的类去继承。或者直接把我们的类中的相关的特殊成员函数声明为private

但是现在我们可以使用delete来修饰这个成员函数,表示删除

也可以在编译器不默认提供这个特殊成员函数的时候,使用default来让编译器提供

这里有一系列的规则用于生成这些特殊函数,但是他们都是有用意的,大家可以查阅相关资料了解

这里举个例子,如果用户没有提供一个拷贝构造函数,拷贝赋值函数,移动赋值函数,以及析构函数,那么编译器会自动提供一个移动构造函数

当我们没提供这些拷贝的行为的时候,其实就是编译器默认我们的行为是移动构造,同时还要满足我们没定义析构函数,使用的是默认的析构函数,否则的话在移动的时候会不安全。

使用方法就是在函数声明的后面加上修饰,即function() = default或function() = delete

还有两个比较常用的修饰,分别是override和final

override表示显式的重写父类的虚函数,这时候编译器会帮你检查

final则是和java类似,修饰函数表示该函数不能再被子类重写,而修饰类则表示该类不能再被继承

标签: c++
最后更新:2021年8月29日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS