分享

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

 新用户0118F7lQ 2023-09-05 发布于山东

图片

问题

    假如拷贝构造函数的形式变为 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)')来传递参数,这样不会创建额外的副本,而只是传递对象的引用。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多