第二章构造函数语意学——关于bitwise copy semantics

关于这个问题,第一遍看的时候比较晕,不知道这个什么 bitwise copy是个什么东西,其实很简单,就是 位逐次拷贝(我靠,一句好犀利的废话)。额,具体来说呢,就是对 源类中的成员变量 中的每一位 都逐次 复制到 目标类中。具体的内容接着看。

首先让我们看看这个概念是怎么出来的。书中第50页的时候说到:

Default constructors 和 copy constructors 在 必要的时候 才由编译器产生出来

这个句子中的“必要”意指当class不展现bitwise copy semantics时。


这段话的意思呢,应该是这么个意思: 如果class中出现了bitwise copy semantics的时候,default constructors和copy constructors 编译器就不会为我们产生出来(又像一句废话)。那么没有default constructors和copy constructors的时候,我们的类怎么产生呢。这时候,就是通过  bitwise copy 来搞定了,也就是 将 源类中的成员变量中的每一位都逐次复制到 目标类 中,这样我们的类就构造出来了。(当然,这个是我的理解,这个 是否是 源类中的成员变量,还有待于证实)。

这时候,这种bitwise copy构造的类 就会存在一个问题,就是对于指针变量来说,源类中的指针变量保存的是开辟的空间,而目标类中的的指针变量,是通过逐位复制的方式得到的,这样,目标类中的指针变量保存的地址和源类的是一样的。当源类释放空间之后,目标类中的指针变量指的是一堆无意义的空间,这样,当目标类中的指针变量再释放空间的时候,就会报错。这段也就是P52注释所说的内容。

扯了这么多,还是看代码吧,把书中的例子完全实现了下。代码如下:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Word
{
public:
    Word( const  char *s)
    {
        str =  new  char[strlen(s) +  1];  // 开辟空间
        strcpy(str, s);
        cnt = strlen(s) +  1;
    }
    ~Word()
    {
         delete[] str;  // 释放空间
    }

public:
     int cnt;
     char *str;
};


int main( int argc, _TCHAR *argv[])
{
    Word noun( "book"); //调用构造函数
    Word verb = noun; // 不会产生copy constructors
    cout << verb.str << endl;
    cout << verb.cnt << endl;

    cout <<  "noun.str address = " << ( unsigned  long)(noun.str) << endl;
    cout <<  "verb.str address = " << ( unsigned  long)(verb.str) << endl;
     return  0;
}

结果如下:

book
5
noun.str address = 3243208
verb.str address = 3243208

可以看到,完全复制了过去,而且指针的地址是一样的,只是最后会报错,也就是之前讨论过的,释放空间的问题。

到这里关于bitwise copy就这么多了,关于什么时候会调用bitwise copy进行复制呢,见书53页。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值