专栏首页C++核心准则原文翻译C++核心准则C.44:默认构造函数最好简单而且不会抛出异常

C++核心准则C.44:默认构造函数最好简单而且不会抛出异常

C.44: Prefer default constructors to be simple and non-throwing

C.44:默认构造函数最好简单而且不会抛出异常

Reason(原因)

Being able to set a value to "the default" without operations that might fail simplifies error handling and reasoning about move operations.

默认构造函数可以将内容设置到默认状态而不需要可能引起失败的操作,简化了错误处理和针对移动操作的推测。

Example, problematic(问题示例)

template<typename T>
// elem points to space-elem element allocated using new
class Vector0 {
public:
    Vector0() :Vector0{0} {}
    Vector0(int n) :elem{new T[n]}, space{elem + n}, last{elem} {}
    // ...
private:
    own<T*> elem;
    T* space;
    T* last;
};

This is nice and general, but setting a Vector0 to empty after an error involves an allocation, which may fail. Also, having a default Vector represented as {new T[0], 0, 0} seems wasteful. For example, Vector0<int> v[100] costs 100 allocations.

这段代码整洁且普通,但是如果过在涉及到内存分配的错误之后生成一个空的Vector0对象时,可能会失败。同时,让默认的Vector表现为{new T[0], 0, 0}有些浪费。例如Vector0<int>v[100]需要100次内存分配。

100次内存分配似乎有些问题。译者的理解是只要一次分配100个整数的空间就好。

另外new T[0]有点奇怪。

Example(示例)

template<typename T>
// elem is nullptr or elem points to space-elem element allocated using new
class Vector1 {
public:
    // sets the representation to {nullptr, nullptr, nullptr}; doesn't throw
    Vector1() noexcept {}
    Vector1(int n) :elem{new T[n]}, space{elem + n}, last{elem} {}
    // ...
private:
    own<T*> elem = nullptr;
    T* space = nullptr;
    T* last = nullptr;
};

Using {nullptr, nullptr, nullptr} makes Vector1{} cheap, but a special case and implies run-time checks. Setting a Vector1 to empty after detecting an error is trivial.

使用{nullptr, nullptr, nullptr}让Vector1{}的代价更小,但是特殊的情况,(由于产生了没有数据的情况,译者注)需要运行时检查。在检测到错误之后将Vector1设为空的处理是小事情。

Enforcement(实施建议)
  • Flag throwing default constructors.
  • 提示抛出异常的构造函数。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c44-prefer-default-constructors-to-be-simple-and-non-throwing


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.47: 使用nullptr表现空指针,而不是0或NULL​

    Readability. Minimize surprises: nullptr cannot be confused with an int. nullptr...

    面向对象思考
  • C++核心准则编译边学-F.25 使用zstring或not_null<zstring>表示C风格字符串

    C-style strings are ubiquitous. They are defined by convention: zero-terminated ...

    面向对象思考
  • C++核心准则编译边学-F.23 使用not_null<T>表明“空”是无效值

    Clarity. A function with a not_null<T> parameter makes it clear that the caller ...

    面向对象思考
  • Vim编码知识,乱码问题

    原文:http://demi-panda.com/2012/12/26/vim-encoding/

    一见
  • 【作业】结对编程纪实

    在Graph类上,我们封装了SimpleChainModel和WordChainModel两个类,用于对图论的构图,计算,数据调度等行为进行底层封装。

    HansBug
  • openfalcon架构及相关服务配置详解

      agent内置了一个http接口,会自动采集预先定义的各种采集项,每隔60秒,push到transfer。

    yaohong
  • 近期工作与学习技术总结

    逍遥剑客
  • Grafana使用mysql作为数据源,呈现图表

    近期在使用python写一套模拟API请求的监控项目,考虑数据可视化这方面就采用grafana来呈现,下面来看看怎么弄。

    Devops海洋的渔夫
  • 『Flutter-绘制篇』实现炫酷的雨雪特效

    前不久,利用周末时间学习并完成一个简单的 Flutter 项目 - 简悦天气,简约不简单,丰富不复杂,这是一款简约风格的 flutter 天气项目,提供实时、...

    老孟Flutter
  • 华宴小露,重幔初挑:SDCC 2017·深圳站讲师+议题首轮抢鲜

    用户1737318

扫码关注云+社区

领取腾讯云代金券