zoukankan      html  css  js  c++  java
  • 【转载】C++中的位拷贝和值拷贝

    ---恢复内容开始---

    原文:C++中的位拷贝和值拷贝

    原文:http://blog.csdn.net/liam1122/article/details/1966617

      为了便于说明我们以String类为例:

      首先定义String类,而并不实现其成员函数。 

    复制代码
    Class String
    
    {
        public:
           String(const char *ch=NULL);//默认构造函数
           String(const String &str);//拷贝构造函数
           ~String(void);
           String &operator=(const String &str);//赋值函数
        private:
           char *m_data;
    }; 
    复制代码

    位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个String对象A和B。A.m_data和B.m_data分别指向一段区域,A.m_data="windows",B.m_data=“linux";

    如果未重写赋值函数,将B赋给A;则编译器会默认进行位拷贝,A.m_data=B.m_data

    则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:

    (1):A.m_data原来指向的内存区域未释放,造成内存泄露。

    (2):A.m_data和B.m_data指向同一块区域,任何一方改变都会影响另一方

    (3):当对象被析构时,B.m_data被释放两次。

    对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。

    如果重写赋值函数和拷贝构造函数后,

    A.m_data=B.m_data,进行的是值拷贝,会将B.m_data的内容赋给A.m_data,A.m_data还是指向原来的内存区域,但是其内容改变。

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

    位拷贝就是传递的值是参数的地址,值拷贝就是传递的值是参数本身的值。

    深拷贝拷贝的是对象,浅拷贝拷贝的是内存。

    按位拷贝就是拷贝对象的时候实际会用像memcpy()这种来复制这块数据到目的对象处,按成员拷贝则要对这个类的每个成员逐一复制(这些成员可能想调用自己定义的拷贝函数). 这会比较慢.位拷贝速度快. 但语义上来说并不总是我们希望的. 所以它们也是各自有各自的用处.

    参考:

    http://topic.csdn.net/u/20081106/12/4ac743c8-99a2-4dd9-8532-3378e644a0f8.html?85412

    ---恢复内容结束---

  • 相关阅读:
    POJ 题目1145/UVA题目112 Tree Summing(二叉树遍历)
    车牌号
    小程序开发 标题新闻
    小程序开发 轮播
    小程序开发
    App phonegap
    Jquery Cookie操作
    App 添加权限
    App WebView实例化
    Vue 组件化
  • 原文地址:https://www.cnblogs.com/zhehan54/p/5967245.html
Copyright © 2011-2022 走看看