问题假如拷贝构造函数的形式变为 Point(const Point rhs),原来的拷贝构造函数形式是Point(const Point &rhs)。 void func(Point pt){
}
int main(){
func(pt2);
} 这个程序会怎么样? 答案这个程序会无限循环下去,最终导致栈溢出或崩溃! 解析拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。其作用是使用一个已经存在的对象去初始化另一个同类的对象。 调用拷贝构造函数的三种情况:
对于上面的问题: 在函数调用 func(pt2) 时,会试图使用拷贝构造函数来创建 Point 对象,但是参数是按值传递的,而不是按引用传递的。 当你调用 func(pt2) 时,传递给 func 的参数是 pt2 的副本,因为你的拷贝构造函数接受参数 rhs 时是按值传递的。所以在调用 func(pt2) 时,会执行以下步骤:
这会导致程序陷入无限递归循环,最终导致栈溢出或崩溃,因为每次递归都要创建新的对象,而新对象的创建又触发了新一轮的拷贝构造函数调用。 为避免无限递归,应该使用引用(原来的形式 'Point(const Point &rhs)')来传递参数,这样不会创建额外的副本,而只是传递对象的引用。 |
|
来自: 新用户0118F7lQ > 《文件夹1》