今天朋友问我一个特别有意思的点,eg:
1 | class Person{ |
无论是系统默认还是自定义的拷贝构造函数,都是传一个引用
,而不是值
,这是为什么呢?
naive的我想了想:节省一次值拷贝(赋值给形参),节省空间?
当然不会那么简单。若拷贝构造函数参数为值传递,当实参赋值给形参时,又发生了一次拷贝函数的调用,无限递归下去,导致爆栈。
1 | //拷贝构造函数变成这样 |
这个例子还要注意一点:m_height
开辟在堆区,利用赋值运算符 operator=进行类对象赋值时,因此不能只是做简单浅拷贝(防止析构时野指针的出现—-一个内存地址有两个指向的指针),因此需要自定义拷贝构造函数。
结论:拷贝构造函数参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导致栈溢出。
各种构造函数也是重载,编译器自动找寻合适的函数。
PS:没事多看看C++ Primer,讲的细又深刻。 名字查找优于类型查找,其本质是作用域