复制构造函数中出现异常的可能原因是什么?

时间:2015-03-23 16:20:26

标签: c++ exception constructor

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

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

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

2 个答案:

答案 0 :(得分:2)

如果通过“做一个例外”你的意思是它可能会抛出一个例外,那么没有。并非每个复制构造函数都可以。如果类只包含一个int,并且复制构造函数只是复制int,那么就不会抛出异常。

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

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

答案 1 :(得分:1)

除了析构函数和main之外,任何C ++函数理论上都可以抛出异常,具体取决于程序员编写的内容。

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

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

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