更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

C++培训课程笔记--拷贝构造函数中的陷阱

  • 发布:C++培训
  • 来源:网络
  • 时间:2019-01-15 13:11

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所指的对象被修改的原因。·

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

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

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容


预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C++培训课程--菱形继承产生的问题及解决
下一篇:C++开发-条件变量整理
  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省