C++中的位拷贝与值拷贝

原创 2015年07月08日 16:14:24

以String类为例:

class String{

public:

        String(const char * p=NULL);//默认构造函数

        ~String(void);//默认析构函数

        String(const String &str);//拷贝构造函数

        String & operator = (const String &str);//赋值函数

private:

        char * m_data;

}

位拷贝拷贝的是地址,而值拷贝拷贝的是内容。

假定有两个String类对象A和B,则A.m_data和B.m_data分别指向两个不同的空间。

如果没有覆写赋值函数,执行语句:A.m_data = B.m_data;则编译器默认进行位拷贝,A.m_data与B.m_data就指向了同一块地址,虽然A.m_data的内容与B.m_data的内容一致了,但会出现如下问题:

(1)A.m_data原来指向的内存没有释放,容易出现内存泄露;

(2)当A.m_data和B.m_data中的任意一个被修改,则会影响另外一个,对数据不安全;

(3)当对象A、B析构的时候,内存将被释放两次。


当用一个已经初始化过的自定义类类型对象去初始化另一个对象的时候,拷贝函数将被自动调用。也就是说当类的对象需要拷贝时,拷贝函数就会被调用。

以下情况都会调用拷贝构造函数:

(1)一个对象以值传递的方式传入函数体;

(2)一个对象以值传递的方式从函数体返回;

(3)一个对象需要用另一个对象来初始化。

默认的拷贝构造函数是位拷贝,如果类对象中有指针类型的成员,在调用拷贝构造函数的时候就会出现两个对象的指针成员指向了同一块内存,那么就会出现上面所提的三个问题。

C++拷贝构造、移动构造与返回值优化

转自:http://findingsea.github.io/2017/06/21/C-copy-constructor-move-constructor-and-return-value-optim...

C++函数参数,返回值,拷贝构造函数等

相信大家对C++的特性有了比较多的了解, 这一节我们来对函数参数(实参, 虚参), 返回值机制;类深度拷贝构造,赋值操作符 使用更深一步的了解。如果你对这一节完全了解,恭喜你,你对C++的了解不...

关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解

几乎所有C++的书籍中都强烈建议函数返回的时候,要使用按引用返回、甚至直接返回指针,尤其是涉及到class和struct的时候。 如果函数返回对象,而不是指针,那么在执行return的时候,...
  • lslxdx
  • lslxdx
  • 2012年04月18日 20:48
  • 1296

C++返回值的“拷贝”问题

这个问题本不是什么新鲜玩意了,但最近在和同事调试程序性能的时候,经常会提起这个问题。看来编译器的RVO和NRVO这个问题还是没有达到普及性。先看一段代码:#include using namespac...
  • e5Max
  • e5Max
  • 2015年12月04日 23:10
  • 919

C++构造函数、拷贝构造函数、赋值运算符漫谈(二)——函数返回值

首先我们先看一下C程序的返回值处理情况,我们知道当C函数返回int等小型数据时直接将返回值放入eax寄存器。那当返回大的数据结构又是如何处理呢?看如下一段代码: #include typede...

C++primer_拷贝控制之13.26联系控制成员实现类值行为

这是StrBlob.h头文件,所有函数均定义为内联函数#ifndef _MY_STRBLOB_H #define _MY_STRBLOB_H #include #include #in...
  • VCCTor
  • VCCTor
  • 2015年12月15日 01:23
  • 243

C++中慎用逐位拷贝(bitwise copy)的函数

1.简单介绍C语言中的memcpy(),memset(),memcmp()函数   memcpy(),memset(),memcmp()等这些内存操作函数经常会帮我们完成一些数据复制、赋值等操作。因...

C++中拷贝构造函数的调用与C++返回值优化

C++ 拷贝构造函数 深拷贝 浅拷贝

C++拷贝构造函数和赋值操作

  • 2012年01月10日 13:51
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的位拷贝与值拷贝
举报原因:
原因补充:

(最多只允许输入30个字)