打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C | 拷贝构造函数输入变为值传递会怎么样?

问题

    假如拷贝构造函数的形式变为 Point(const Point rhs),原来的拷贝构造函数形式是Point(const Point &rhs)。

void func(Point pt){

}
int main(){
func(pt2);
}

    这个程序会怎么样?

答案

    这个程序会无限循环下去,最终导致栈溢出或崩溃

解析

    拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。其作用是使用一个已经存在的对象去初始化另一个同类的对象。

    调用拷贝构造函数的三种情况:

  • (1) 当用类的一个对象去初始化该类的另一个对象时。

  • (2) 当函数的形参是类的对象,调用函数,进行形参和实参结合时。

  • (3) 当函数的返回值是对象,函数执行完成,返回调用者时。

    对于上面的问题:

    在函数调用 func(pt2) 时,会试图使用拷贝构造函数来创建 Point 对象,但是参数是按值传递的,而不是按引用传递的。

    当你调用 func(pt2) 时,传递给 func 的参数是 pt2 的副本,因为你的拷贝构造函数接受参数 rhs 时是按值传递的。所以在调用 func(pt2) 时,会执行以下步骤:

  1. 调用 func,将 pt2 的副本传递给 pt。

  2. 在传递参数时,会调用拷贝构造函数来创建 pt 的副本。

  3. 在创建 pt 的副本时,又会调用拷贝构造函数,以此类推,形成无限递归。

    这会导致程序陷入无限递归循环,最终导致栈溢出或崩溃,因为每次递归都要创建新的对象,而新对象的创建又触发了新一轮的拷贝构造函数调用。

    为避免无限递归,应该使用引用(原来的形式 'Point(const Point &rhs)')来传递参数,这样不会创建额外的副本,而只是传递对象的引用。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
04选择题: C++ 对象 执行顺序
shared_ptr的一些尴尬
c++类的构造函数详解
拷贝构造函数与初始化列表
c++的拷贝构造函数中直接使用私有变量
必须要注意的C++动态内存资源管理(六)vector的简单实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服