2

如何在 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

主要功能:

#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();
}

输出结果:

创建的对象。

通过“新”运算符创建的指针。

创建的对象。

我的 operator& 没有被叫到。为什么?

4

2 回答 2

14

您当前正在重载二元&运算符(即按位与)。要重载一元运算&符,您的函数不应接受任何参数。它适用的对象是 所指向的对象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 回答