我怎样才能使操作员过载?在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;没被叫。为什么呢?
答案 0 :(得分:13)
您当前正在重载二进制&
运算符(即按位AND)。要重载一元&
运算符,您的函数应该不带参数。它适用的对象是this
指向的对象。
Object *Object::operator& (){
++(this->ptrCount);
std::cout << "Counter is increased." << std::endl;
return this;
}
答案 1 :(得分:2)
sftrabbit answer关于语法是正确的,但请注意您使用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
期间(破坏后称之为),你无法“将它从死亡中拯救出来”。它的目的是放置墓碑,而不是复活尸体。