C++拷贝构造函数中的陷阱怎么解决

C++拷贝构造函数中的陷阱怎么解决

这篇文章主要讲解了“C++拷贝构造函数中的陷阱怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++拷贝构造函数中的陷阱怎么解决”吧!

拷贝构造函数大家都比较熟悉,通俗讲就是传入一个对象,拷贝一份副本。
不过看似简单的东西,实际不注意的话就会产生问题!

C++拷贝构造函数中的陷阱怎么解决

#include<iostream>usingnamespacestd;classCExample{public:inta,b,c;char*str;public://构造函数CExample(inttb){a=tb;b=tb+1;c=tb+2;str=(char*)malloc(sizeof(char)*10);strcpy(str,"123456789");cout<<"creat:"<<endl;}//析构函数~CExample(){cout<<"delete:"<<endl;}voidShow(){cout<<a<<endl;}//拷贝构造//CExample(constCExample&C)//{//str=(char*)malloc(sizeof(char)*10);//strcpy(str,C.str);//cout<<"copy"<<endl;//}};//全局函数,传入的是对象voidg_Fun(CExampleC){C.a=0;C.b=0;C.b=0;strcpy(C.str,"aaabbbccc");cout<<"test"<<endl;}intmain(){CExampletest(1);cout<<"str:"<<test.str<<"a="<<test.a<<"b="<<test.b<<"c="<<test.c<<endl;g_Fun(test);//传入对象cout<<"str:"<<test.str<<"a="<<test.a<<"b="<<test.b<<"c="<<test.c<<endl;getchar();return0;}

这个结果似乎出乎了我们的预料,作为形式参数 test对象被修改了,同时是test.str的部分被修改了,test的整数成员变量没有被修改!

咱们先了解一下系统默认的拷贝构造函数,因为类中没有写自己的拷贝构造函数,所以调用的是默认的拷贝构造函数。

Thinking in c++:对于简单结构,编译器会自动生成一个缺省的,就是位拷贝(bitcopy)。

对于比较复杂的类型,编译器就会自动生成一个缺省的拷贝构造函数。

classCExample{inta,b,c;};

这就是一个简单结构的类,位拷贝,就是按对象在内存中的二进制进行拷贝,对于不涉及指针等类型的时候,位拷贝是比较不错的拷贝方法。

但是,要是一个类中有指针类型的时候,如:

classCExample{inta,b,c;char*str;};

位拷贝就会把指针地址拷贝了一下,话句话说,这里只进行了“浅拷贝”,一旦副本里涉及到指针的操作,必然就会影响到原始对象的成员变量,这就是导致,上面代码中对象的整数变量没被修改(对整数变量的位拷贝其实就是一种“深拷贝”),而str所指的对象被修改的原因。

那么该如何防止对副本的修改影响原始对象呢?

答案是用户自定义拷贝构造函数!

CExample(constCExample&C){a=C.a;b=C.b;c=C.b;str=(char*)malloc(sizeof(char)*10);strcpy(str,C.str);cout<<"copy"<<endl;}

这样就可以正确完成拷贝构造的操作了。

总结:对于简单的数据类型,可以使用系统默认的拷贝构造函数;但对于复杂的数据类型(如指针),其实就是深拷贝和浅拷贝的区别!一般类如果包含指针或引用成员,应该遵守Rule of Three原则。

@24K纯开源 指出的三法则:
三法则(英语:rule of three,the Law of The Big Three,The Big Three;三法则,三大定律)在 C++ 程序设计里,它是一个以设计的基本原则而制定的定律,三法则的要求在于,假如类型有明显地定义下列其中一个成员函数,那么程序员必须连其他二个成员函数也一同编写至类型内,亦即下列三个成员函数缺一不可。

析构函数(Destructor

复制构造函数(copy constructor

复制赋值运算符(copy assignment operator

感谢各位的阅读,以上就是“C++拷贝构造函数中的陷阱怎么解决”的内容了,经过本文的学习后,相信大家对C++拷贝构造函数中的陷阱怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

发布于 2022-01-06 23:31:43
收藏
分享
海报
0 条评论
36
上一篇:C++抽象基类如何理解 下一篇:VUE中的click事件怎么解析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码