2013-04-23 51 views
1

如何使用C++重載運算符&?我已經試過這樣:我該如何重載運算符&in C++

#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 

主要的Tne功能:

#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'操作符創建的指針。

創建對象。

我的運營商&未被調用。爲什麼?

+0

你這樣做:http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris 2013-04-23 12:29:45

+4

嘗試'AB :: Object * ptrObj5 = obj1 & obj1;',你就會知道爲什麼。 – johnchen902 2013-04-23 12:31:59

+3

我認爲你在這裏做什麼是一個非常糟糕的主意。操作員和參考計數會導致悲傷。 – 2013-04-23 12:33:52

回答

13

您目前正在重載二進制&運算符(即按位AND)。爲了使一元運算符&超載,你的函數應該沒有參數。它適用的對象是this指向的對象。

Object *Object::operator&(){ 
    ++(this->ptrCount); 
    std::cout << "Counter is increased." << std::endl; 
    return this; 
} 
+3

另外,你可能想要一個const和一個非const的重載。這個是非const的,你也想要const的那個返回一個const Object *。 – 2013-04-23 12:32:10

+0

@sftrabbit,@ Sebastian Redl 謝謝! – 2013-04-23 12:33:30

+0

除此之外,請注意重載'operator&'通常是一個壞主意,並且您不能使用重載一元'&'在標準容器內的類型... – 2013-04-23 14:31:26

2

sftrabbit answer大約是語法正確的,但要注意你所用newdelete做的是不是一致。

新的和刪除操作符在原始內存上工作,而不在構造對象上工作。

當你A* p = new A ...

  • operator new被調用,...
  • 對象A構造比叫過返回的內存地址,...
  • 最後地址是轉換成A*並給予p

同樣,當你做delete p ...

  • A調用析構函數和...
  • 內存地址是給operator delete被歸還給系統。

在這兩種A對象實例(其成員的值)的狀態不定的情況:

  • operator new力所能及的事你做內,將通過後續的構造函數調用被覆蓋。如果構造函數沒有初始化某些東西,則標準說它的值是未定義的(並且未授予與您在new中設置的值相同的值)。
  • operator delete之內,你所做的任何事情都是在一個已經死了的對象上完成的(並且你在內部發現的內容不被授予「最後的活動狀態」)。

在任何情況下,當您調用delete時對象都會死亡。在operator delete期間(這在銷燬後被調用)期間,您無法「將其從死亡中拯救」。它的目的是放置墓碑,而不是使屍體復活。