1. 拷贝构造函数调用的三种情形
<1> 函数传参时使用对象进行值传递
<2> 函数直接返回某个类对象的值
<3> 使用一个对象去初始化另一个同类的对象,包括两种方式:
部分代码:
class test
{};
test T;
test A(T); //第一种方式
test B=T; //第二种方式
2.拷贝构造函数的参数为什么是引用类型?
假设拷贝构造函数为值传递,那么当程序调用拷贝构造函数时,就符合上述1.<1>,此时就需要再次调用拷贝构造函数,如此循环下去会造成无限递归调用拷贝构造函数而发生栈溢出。故拷贝构造函数的参数必须是引用类型。而因为拷贝构造函数没有返回值,所以不用担心上述1.<2>引起无限递归调用。
3.什么是栈溢出?通常什么情况下会发生栈溢出?
编译器会给程序的调试运行预留指定大小的内存缓冲区,其中包含了堆区、栈区等等。一般从main函数开始,系统会在栈区给所有已调用未返回的函数开辟空间以确保函数的正常执行,函数执行结束后空间会自动回收。当系统为函数运行开辟的总空间超过IDE所允许的最大值而到了非栈的其他区域,这种情况就是栈溢出。
栈溢出是缓冲区溢出的一种,导致其发生的原因通常有三个:
<1> 递归调用函数过深
<2> 局部变量所占总内存过大
<3> 设置的栈空间过小