千家信息网

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

发表于:2024-11-21 作者:千家信息网编辑
千家信息网最后更新 2024年11月21日,这篇文章主要讲解了"C++拷贝构造函数中的陷阱怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++拷贝构造函数中的陷阱怎么解决"吧!拷贝构造函
千家信息网最后更新 2024年11月21日C++拷贝构造函数中的陷阱怎么解决

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

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

#includeusing namespace std;class CExample{public:int a,b,c;char *str;public://构造函数    CExample(int tb)    {        a = tb;        b = tb+1;        c = tb+2;        str=(char *)malloc(sizeof(char)*10);strcpy(str,"123456789");cout<<"creat: "<class CExample{int a,b,c;};

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

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

class CExample{int a,b,c;char *str;};

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

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

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

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

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

总结:对于简单的数据类型,可以使用系统默认的拷贝构造函数;但对于复杂的数据类型(如指针),其实就是深拷贝和浅拷贝的区别!一般类如果包含指针或引用成员,应该遵守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++拷贝构造函数中的陷阱怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0