c++拷贝构造函数引用传参
看一道C++面试题:
给出下述代码,分析编译运行的结果,并提供3个选项: A.编译错误 B.编译成功,运行时程序崩溃 C.编译运行正常,输出10
class A
{
private:
int value;
public:
A(int n){ value = n;}
A(A other){ value = other.value; }
void Print(){ std::cout << value << std::endl; }
};
int main()
{
A a = 10;
A b = a;
b.Print();
return 0;
}
刚开始看到题的时候,我并没有看出猫腻,说实话,自己在C++这里还是个菜菜菜菜菜,如果要我选我会十分忐忑的选C,忐忑是因为知道C肯定不是对的,选C是因为自己又太菜看不出猫腻。
OK,正确答案是编译出错。
现在来解析一下这里的考点:拷贝构造函数传参问题,熟悉C++语法的大佬们都知道在拷贝构造函数A(A other)中有一个很明显的错误,就是形参,正确的形参应该是 const A& other,而不是 A other。
1.除了常量引用能节省空间外,这两个形参有什么区别吗?
有区别,区别很大。我们都知道将实参传递给实参相当于把实参的值赋给形参。执行A b = a;时,会调用 b的拷贝构造函数,此时实参 a会被赋值给形参 other,相当于语句 A other = a; 又会继续调用other的拷贝构造函数,将 a赋值给对象other的拷贝构造函数的形参other,如此一来,就会形成一个递归操作而且没有结束条件,造成堆栈溢出。而C++不会允许这种错误发生,因此 A other做形参会编译错误。
而const A& other就不一样,以引用做形参,并不会调用拷贝构造函数,所以正确。
2.为啥要加const
如果在函数中不会改变引用参数对象的值,加不加const无所谓,但是为了程序的安全性着想,加上const会禁止更改引用参数对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?