zoukankan      html  css  js  c++  java
  • 第二章构造函数语义学——关于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注释所说的内容。

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

    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页。

  • 相关阅读:
    攻防世界 resver catch-me
    elf.h
    攻防世界 reverse 进阶 notsequence
    攻防世界 reverse 进阶 easyre-153
    攻防世界 reverse 进阶 APK-逆向2
    寒假训练 roarctf_2019_realloc_magic(1/250)
    寒假任务
    Main_arena与non_main_arena
    wdb2018_guess
    :: namespace using作用
  • 原文地址:https://www.cnblogs.com/cyttina/p/2781453.html
Copyright © 2011-2022 走看看