位拷贝和值拷贝

位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个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还是指向原来的内存区域,但是其内容改变。如:

 

#include <iostream>

#include <string>

using namespace std;


class HowMany {

public:

static int objectCount;

public:

  HowMany() { objectCount++; }

  static void print(const string& msg = "") {

    if(msg.size() != 0) cout << msg << ": ";

    cout << "objectCount = "

         << objectCount << endl;

  }

  ~HowMany() {

    objectCount--;

    print("~HowMany()");

  }

};

int HowMany::objectCount = 0;

// Pass and return BY VALUE:

HowMany f(HowMany x) {

  x.print("x argument inside f()");

  return x;

}


int main() {

  HowMany h;

  HowMany::print("after construction of h");

  HowMany h2 = f(h);

  HowMany::print("after call to f()");


输出

 

after construction of h: objectCount = 1

x argument inside f(): objectCount = 1

~HowMany(): objectCount = 0

after call to f(): objectCount = 0

~HowMany(): objectCount = -1  //同一块区域被析构两次

~HowMany(): objectCount = -2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值