为什么c++中的复制构造函数的形参是一个引用类型?
3个回答
展开全部
会造成死循环,无限递归
你要理解,函数调用时发生的事情
复制构造函数,其实也是一个函数,如果你给它定义的参数,是一个类型,而不是一个类型的引用,它会首先调用该类型的复制构造函数,重新构造一个新的实例,就像下面一个例子
class myclass 这是一个简单的类
{};
int fun(myclass a); // 这是一个函数
当你调用它时,编译器会自动调用 myclass 类型的构造函数,重新实例化一个myclass的实例
int fun(myclass &a) //这个函数,就不会调用myclass类型的构造函数,只是传递一个指针
好了~现在回到你的问题,赋值构造函数也是构造函数的一种,你给它一个非引用,非指针的参数,它一定会调用该类型的构造函数
这下好了~一个函数不断的调用自己,这样能不出错,能不堆栈溢出么?
简化起来,事情就像这个样子
int fun(myclass a)
{
fun(a);
}
// 你说这个函数会有结束的那一天吗?
你要理解,函数调用时发生的事情
复制构造函数,其实也是一个函数,如果你给它定义的参数,是一个类型,而不是一个类型的引用,它会首先调用该类型的复制构造函数,重新构造一个新的实例,就像下面一个例子
class myclass 这是一个简单的类
{};
int fun(myclass a); // 这是一个函数
当你调用它时,编译器会自动调用 myclass 类型的构造函数,重新实例化一个myclass的实例
int fun(myclass &a) //这个函数,就不会调用myclass类型的构造函数,只是传递一个指针
好了~现在回到你的问题,赋值构造函数也是构造函数的一种,你给它一个非引用,非指针的参数,它一定会调用该类型的构造函数
这下好了~一个函数不断的调用自己,这样能不出错,能不堆栈溢出么?
简化起来,事情就像这个样子
int fun(myclass a)
{
fun(a);
}
// 你说这个函数会有结束的那一天吗?
展开全部
1,CBox( CBox initB) 这样写 好像会报错吧 必须是引用才可以
如果 没有& 那么 传进来的是 形参,就会在调用这个函数的时候
构建一个临时的对象initB,而构建这个临时的initB 必须和实参的那个对象
完全匹配,所以再次调用这个拷贝构造函数,造成无限循环
2,不会,
这个和拷贝构造函数没关系
这个需要你重写operator =函数,
一般 operator = 会返回一个 对象
不过系统默认提供了个 = 函数的重载,
不信,你自己可以下断点调试下,取消注释掉拷贝构造函数,并在这里下断点
然后执行 CBox BottleCrate = BearCrate ;
如果 没有& 那么 传进来的是 形参,就会在调用这个函数的时候
构建一个临时的对象initB,而构建这个临时的initB 必须和实参的那个对象
完全匹配,所以再次调用这个拷贝构造函数,造成无限循环
2,不会,
这个和拷贝构造函数没关系
这个需要你重写operator =函数,
一般 operator = 会返回一个 对象
不过系统默认提供了个 = 函数的重载,
不信,你自己可以下断点调试下,取消注释掉拷贝构造函数,并在这里下断点
然后执行 CBox BottleCrate = BearCrate ;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样可以确保复制的对象是真实存在的,但是碰上一些编译较严格的编译器可能不仅要加&还要在形参类型前面加上const(保证形参在拷贝过程中不会被修改,因为如果拷贝的对象是一个常量那么对常量进行修改是不合法的)
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询