【问题标题】:What are possible reasons for exception in copy constructors?复制构造函数中异常的可能原因是什么?
【发布时间】:2015-03-23 16:20:26
【问题描述】:

我在 Herb Sutter 的书中看到,复制构造函数可能会抛出异常。

我的第一个问题是复制构造函数是否总是会抛出异常?

我的第二个问题是,如果一个不使用 new 运算符和复制构造函数中的其他函数的复制构造函数,是否还有可能的异常?

【问题讨论】:

  • 如果一个复制构造函数总是抛出一个异常,它就不会复制构造任何东西,现在会吗?
  • @DevSolar:我将其解释为“是否存在从不抛出的复制构造函数”?哪个问题更有意义。
  • 我的意思是“复制构造函数总是做一个异常”,总有一些可能的异常的来源。

标签: c++ exception constructor


【解决方案1】:

如果你所说的“做一个异常”是指它可能会抛出一个异常,那么不会。并非每个复制构造函数都这样做。如果类只包含一个 int,而拷贝构造函数只是拷贝这个 int,是不可能抛出异常的。

任意拷贝构造函数是否会抛出异常,真的只是一般问题的特例,任何函数都会抛出异常吗?

如您所料,这完全取决于它调用的其他函数的作用。如果它们中的任何一个使用 throw 或执行一些引发异常的特殊行为,可能是实现定义的,那么它可能会引发异常。否则不行。

【讨论】:

    【解决方案2】:

    除了析构函数和main 之外,几乎所有 C++ 函数理论上都可能引发异常,具体取决于程序员编写的内容。

    并非所有的复制构造函数都会抛出异常。例如,默认情况下,任何“普通旧数据”或“标准布局”结构/类都具有永远不会抛出的复制构造函数。但是,大多数值得讨论的类都包含mapvectorstring,所有这些都有可能抛出std::bad_alloc 的复制构造函数。

    struct person {
        char name[20];
        int id;
        int height;
    };
    

    到目前为止,std::bad_alloc 是复制构造函数中最常见的异常,但任何异常都是可能的。要找出复制可能引发的异常,您必须查看特定类的规范。

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多