C/C++培训
达内IT学院
400-996-5531
C++培训笔记,这篇文章给大家讲述的是C++培训课程中拷贝构造函数中的陷阱
拷贝构造函数大家都比较熟悉,通俗讲就是传入一个对象,拷贝一份副本。
不过看似简单的东西,实际不注意的话就会产生问题!
#include<iostream>
using 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: "<<endl;
}
//析构函数
~CExample()
{
cout<< "delete: "<<endl;
}
void Show ()
{
cout<<a<<endl;
}
//拷贝构造
//CExample(const CExample& C)
//{
// str=(char *)malloc(sizeof(char)*10);
// strcpy(str,C.str);
// cout<<"copy"<<endl;
//}
};
//全局函数,传入的是对象
void g_Fun(CExample C)
{
C.a=0;C.b=0;C.b=0;
strcpy(C.str,"aaabbbccc");
cout<<"test"<<endl;
}
int main()
{
CExample test(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();
return 0;
}
这个结果似乎出乎了我们的预料,作为形式参数 test对象被修改了,同时是test.str的部分被修改了,test的整数成员变量没有被修改!
咱们先了解一下系统默认的拷贝构造函数,因为类中没有写自己的拷贝构造函数,所以调用的是默认的拷贝构造函数。
Thinking in c++:对于简单结构,编译器会自动生成一个缺省的,就是位拷贝(bitcopy)。
对于比较复杂的类型,编译器就会自动生成一个缺省的拷贝构造函数。
class CExample
{
int a,b,c;
};
这就是一个简单结构的类,位拷贝,就是按对象在内存中的二进制进行拷贝,对于不涉及指针等类型的时候,位拷贝是比较不错的拷贝方法。
但是,要是一个类中有指针类型的时候,如
class CExample
{
int a,b,c;
char *str;
};
位拷贝就会把指针地址拷贝了一下,话句话说,这里只进行了“浅拷贝”,一旦副本里涉及到指针的操作,必然就会影响到原始对象的成员变量,这就是导致,上面代码中对象的整数变量没被修改(对整数变量的位拷贝其实就是一种“深拷贝”),而str所指的对象被修改的原因。·
那么该如何防止对副本的修改影响原始对象呢?
答案是用户自定义拷贝构造函数!
免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved