C/C++求职面试总结:二

本文深入探讨了拷贝构造函数的调用场景,解释了为何参数必须为引用类型以避免无限递归调用导致的栈溢出。同时,详细介绍了栈溢出的概念及其常见原因。

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> 设置的栈空间过小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值