2

C++ で operator& をオーバーロードするにはどうすればよいですか? 私はこれを試しました:

#ifndef OBJECT_H
#define OBJECT_H
#include<cstdlib>
#include<iostream>

namespace TestNS{

    class Object{
    private:
        int ptrCount;
    public: 
        Object(): ptrCount(1){           
            std::cout << "Object created." << std::endl;
        }
        void *operator new(size_t size);
        void operator delete(void *p);
        Object *operator& (Object obj);
    };

    void *Object::operator new(size_t size){            
            std::cout << "Pointer created through the 'new' operator." << std::endl; 
            return malloc(size);
        }

    void Object::operator delete(void *p){
            Object * x = (Object *) p;
            if (!x->ptrCount){
                free(x);
                std::cout << "Object erased." << std::endl;
            }
            else{
                std::cout << "Object NOT erased. The " << x->ptrCount << "references are exist." 
                    << std::endl;
            }
        }
    
    Object *Object::operator& (Object obj){
            ++(obj.ptrCount);
            std::cout << "Counter is increased." << std::endl;
            return &obj;
        }
}
#endif

主な機能:

#include<iostream>
#include"Object.h"

namespace AB = TestNS;

int main(int argc, char **argv){
    AB::Object obj1;
    AB::Object *ptrObj3 = &obj1; // the operator& wasn't called.
    AB::Object *ptrObj4 = &obj1; // the operator& wasn't called.

    AB::Object *obj2ptr = new AB::Object();
}

出力結果:

オブジェクトが作成されました。

「new」演算子によって作成されたポインター。

オブジェクトが作成されました。

オペレーターが呼び出されませんでした。なんで?

4

2 に答える 2

14

現在、二項&演算子 (つまり、ビットごとの AND) をオーバーロードしています。単項&演算子をオーバーロードするには、関数が引数を取らないようにする必要があります。それが適用されるオブジェクトは、 によって指されるオブジェクトthisです。

Object *Object::operator& (){
    ++(this->ptrCount);
    std::cout << "Counter is increased." << std::endl;
    return this;
}
于 2013-04-23T12:30:03.900 に答える
2

sftrabbitの答えは構文については正しいですが、あなたがしていることは一致していないnewことに注意してください。delete

new および delete 演算子は、構築されたオブジェクトではなく、生のメモリで機能します。

あなたがするときA* p = new A...

  • operator new呼び出されて...
  • オブジェクトAコンストラクターは、返されたメモリアドレスに対して呼び出され、...
  • 最終的にアドレスは に変換されA*、 に与えられpます。

同様に、あなたがするときdelete p...

  • デストラクタが呼び出されAて...
  • メモリアドレスはoperator delete、システムに返されるために与えられます。

どちらの状況でも、Aオブジェクト インスタンス (そのメンバーの値) の状態は未定義です。

  • あなたoperator newが何をしても、その後のコンストラクター呼び出しによって上書きされます。コンストラクターが何かを初期化しない場合、標準では、その値は未定義であると規定されています (また、 で設定できる値と同じであることは認められていませんnew)。
  • あなたがすることはoperator delete何でも、すでに死んでいるオブジェクトに対して行われます(そして、その中で見つけたものは、「最後のライブ状態」であるとは認められません.

いずれにせよ、delete を呼び出すとオブジェクトは消滅します。途中で「死から救う」ことはできませんoperator delete(これは破壊後に呼び出されます)。その目的は墓石を設置することであり、死体を生き返らせることではありません。

于 2013-04-23T12:53:00.977 に答える