下面是一个非常简单的例子,说明它是如何工作的copy constructor
:
class Base
{
public:
Base() { std::cout << "Base default constructor invoked!" << std::endl; };
Base(const Base& copy) { std::cout << "Base copy constructor invoked!" << std::endl; };
Base& operator=(const Base& copy) = default;
};
class Derived : public Base
{
public:
Derived() { std::cout << "Derived default constructor invoked!" << std::endl; }
Derived(const Derived& copy) { std::cout << "Derived copy constuctor invoked!" << std::endl; }
};
int main(void)
{
Derived der;
Derived der0 = der;
return 0;
}
如果在函数中将 ,main
更改Derived der0
为Derived& der0
,则copy constructor
不会调用它。
因此,问题出现了,为什么当我们通过引用捕获异常时:
try
{
// throw error
}
catch(std::exception& e) {}
然后我们将调用一个复制构造函数,并且只针对该类exception
?为什么在正常情况下,我们(如上面的示例)在执行Base
时不为类调用任何复制构造函数Derived& der0 = der
,而是在块catch
中调用它,而只是排除最顶层?
在这里找到了它如何工作的示例,但没有解释。