我怎样才能超负荷操作员和在C ++中

时间:2013-04-23 12:27:15

标签: c++

我怎样才能使操作员过载?在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();
}

输出结果:

  

已创建对象。

     

通过'new'运算符创建的指针。

     

已创建对象。

我的运营商&amp;没被叫。为什么呢?

2 个答案:

答案 0 :(得分:13)

您当前正在重载二进制&运算符(即按位AND)。要重载一元&运算符,您的函数应该不带参数。它适用的对象是this指向的对象。

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

答案 1 :(得分:2)

sftrabbit answer关于语法是正确的,但请注意您使用newdelete所做的事情并不一致。

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期间(破坏后称之为),你无法“将它从死亡中拯救出来”。它的目的是放置墓碑,而不是复活尸体。