我在Herb Sutter的书中看到复制构造函数可能会抛出异常。
我的第一个问题是复制构造函数是否总是会抛出异常?
我的第二个问题是,如果复制构造函数不使用new运算符和复制构造函数中的其他函数,是否仍有可能的异常?
答案 0 :(得分:2)
如果通过“做一个例外”你的意思是它可能会抛出一个例外,那么没有。并非每个复制构造函数都可以。如果类只包含一个int,并且复制构造函数只是复制int,那么就不会抛出异常。
任意拷贝构造函数是否可能抛出异常,实际上只是一般问题的特例,任何函数都会抛出异常吗?
正如您所料,它完全取决于它所调用的其他功能。如果它们中的任何一个使用throw或执行一些抛出异常的特殊行为,可能是实现定义的,那么它可能会抛出异常。否则不会。
答案 1 :(得分:1)
除了析构函数和main
之外,任何C ++函数理论上都可以抛出异常,具体取决于程序员编写的内容。
并非所有复制构造函数都会抛出异常。例如,任何"普通旧数据"或"标准布局"默认情况下,structs / classes具有永不抛出的复制构造函数。但是,大多数值得讨论的课程都包含map
或vector
或string
,所有这些课程都有可能会抛出std::bad_alloc
的副本构造函数。
struct person {
char name[20];
int id;
int height;
};
到目前为止,std::bad_alloc
是复制构造函数中最常见的例外,但任何异常都是可能的。要找出复制可能引发的异常,您必须查看特定类的规范。