简单的C ++地址/指针说明

时间:2015-01-08 00:37:00

标签: c++

第一个临时任务(1)是否无效(嗯,除了声明一个类型)?我认为第二项任务只是覆盖了key_record的临时指针。

   void store_key( const key_data& key )
   {
      owallet_key_record key_record = ...
      key_data& temp = *key_record;  // 1
      temp = key;
   }

编辑:参考,https://github.com/BitShares/bitshares/blob/v0.4.28-dev1/libraries/wallet/wallet_db.cpp#L555-L556

注意,temp不再使用。此外,这种技术在文件中以相同的模式多次使用,因此必须是有意的。

3 个答案:

答案 0 :(得分:2)

您的想法是正确的,但我不会将参考声明描述为“无用”。

根据store_key()方法中的其他内容,这种引用声明通常用于清晰,并且可能使引用对象的频繁使用更加清晰和可读。

即使没有,也应该将代码优化留给编译器。如果临时引用导致更清晰,更易于理解的代码,那么这就足够了。让编译器担心优化掉不需要的临时工。

答案 1 :(得分:1)

在回答时,owallet_key_record的定义不可用。说实话,我并不关心它的定义是什么,因为你的问题实际上是在寻求一个假设的情况,这个“习语”可能有意义。如果你想知道为什么它对这个特定的源代码有意义,那么这对你来说不是正确的答案(但对其他人来说仍然有用)。

可能是类型*owallet_key_record导致一个类型定义了自己的赋值运算符,但是有一个转换运算符为key_data &

所以,例如:

struct owallet_key_record {
    key_data k;
    struct deref {
        owallet_key_record *r;
        ~deref () { r->release(); }
        deref (owallet_key_record *x) : r(x) { r->acquire(); }
        deref (const deref &d) : r(d.r) { r->acquire(); }
        deref & operator = (deref d) { std::swap(r, d.r); return *this; }
        operator key_data & () { return r->key(); }
    };
    deref operator * () { return this; }
    key_data & key () { return k; }
    void acquire () {}
    void release () {}
};

然后以下将失败:

owallet_key_record key_record /*= ...*/;
*key_record = key;

答案 2 :(得分:1)

你错了。第一个"任务"实际上不是一项任务。它初始化了一个引用。

无法重新初始化参考。第二个=是真正的作业。它更改*key_record,即temp引用的对象。

但是,一位称职的C ++程序员只会编写*key_record = key。该引用只是命名*key_record的结果,而temp根本不是一个有用的名称。