假如拷贝构造函数的形式变为 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) 时,会执行以下步骤:
调用 func,将 pt2 的副本传递给 pt。
在传递参数时,会调用拷贝构造函数来创建 pt 的副本。
在创建 pt 的副本时,又会调用拷贝构造函数,以此类推,形成无限递归。
这会导致程序陷入无限递归循环,最终导致栈溢出或崩溃,因为每次递归都要创建新的对象,而新对象的创建又触发了新一轮的拷贝构造函数调用。
为避免无限递归,应该使用引用(原来的形式 'Point(const Point &rhs)')来传递参数,这样不会创建额外的副本,而只是传递对象的引用。
联系客服