构造函数与复制构造函数
在复制构造函数中的引用符,时有时不有,初学时不易理解,做点小归纳:
预备知识:#
-
当类中没有定义任何构造函数(包括复制构造函数)时,编译器将生成默认构造函数
-
当类中没有定义复制构造函数时,编译器将生成默认复制构造函数
-
复制构造函数主要用途是避免浅复制所带来的坏的影响
- 如果对象中有主动分配的内存时,在对象被析构释放分配的内存时,避免出现重复释放(当函数调用结束时,形参指向的空间已经被析构掉,当实参生存期结束也被析构,这个时候会出现重复释放同一块内存区域的错误)
- 避免函数内部通过形参误修改函数外部实参指向的数据;
调用函数的形参带不带引用符:#
1. 若形参带引用符号时,则为引用传递,不进行实例化对象
2. 若形参不带引用符号,则为值传递,实例化一个形参对象,并用实参进行初始化
a. 若没有复制构造函数,则在值传递过程出现浅复制。
b. 若存在复制构造函数,复制构造函数将会帮我们深复制。
TALK IS CHEAP , SHOW YOU CODE:
需要的代码如下,后面根据不同情况做点小更改,就不再复制粘贴了;
class MAN { public : int *arr; int size; MAN(const MAN & m); //复制构造函数 MAN( ) { //构造函数 cout << "-----------construct" << endl; arr = new int[20]; size = 20; } ~MAN( ) { delete[ ]arr; } // 析构 }; //MAN::MAN(const MAN &m) { // cout << "-----------copy construct" << endl; // arr = new int[20]; // size = m.size; // memcpy(arr, m.arr, 20); //} void dis(MAN &x) { cout << " in disssssss" << endl; x.size = 666; cout << x.arr << endl; cout << " out disssssss" << endl; } int main( ) { MAN s; cout << s.size << endl; cout << s.arr << endl; dis(s); cout << s.size << endl; cout << s.arr<< endl; }
1. 若调用函数的类参数带引用符号时,则为引用传递,则此时不进行实例化对象
声明复制构造函数,注释定义,此时不调用复制构造函数
2. 若调用函数的类参数不带引用符号,则为值传递,实例化一个形参对象,并用实参进行初始化
-
若没有复制构造函数,则在值传递过程出现浅复制(只将数据成员进行传值复制),出现重复析构;
复制构造函数注释定义,并将dis参数表中&符去掉;
将复制构造函数全注释,并将dis参数表中&符去掉;则使用编译器默认的复制构造函数,出现浅复制
-
若存在复制构造函数,
将复制构造函数全解注释,并将dis参数表中&符去掉;
感兴趣想要阅读更多请参考这篇博文https://www.cnblogs.com/alantu2018/p/8459250.html
作者:chenyun
出处:https://www.cnblogs.com/starrys/p/11486850.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步