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

如何在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,c++,C++,主要功能: #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; /

主要功能:

#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();
}
输出结果:

对象已创建

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

对象已创建


我的接线员&没有接到电话。为什么?

您当前正在重载二进制运算符&即按位AND。要重载一元运算符&运算符,函数不应接受任何参数。它所应用的对象就是它所指向的对象


您当前正在重载二进制和运算符,即按位和。要重载一元运算符&运算符,函数不应接受任何参数。它所应用的对象就是它所指向的对象

语法是正确的,但请注意,您对new和delete所做的操作并不一致

new和delete操作符处理原始内存,而不是构造的对象

当你做A*p=新A

呼叫新操作员,然后。。。 然后通过返回的内存地址调用构造函数的对象,然后。。。 最后,地址被转换成A*并被赋予p。 同样,当您删除p

调用析构函数,然后。。。 内存地址将提供给操作员delete,并返回给系统。 在这两种情况下,对象实例的状态及其成员的值均未定义:

在操作符内部,无论您做什么,都将被后续的构造函数调用覆盖。如果构造函数没有初始化某些东西,标准会说它的值是未定义的,并且不允许与您在new中设置的值相同。 在操作符内部,删除您在已经死亡的对象上执行的任何操作,并且您在其中发现的内容不被授予最后一个活动状态。 在任何情况下,当您调用delete时,对象都会死亡。在销毁后调用的运算符delete期间,无法将其从死状态保存。它的目的是放置墓碑,而不是使尸体复活。

语法是正确的,但要注意,使用new和delete所做的操作并不一致

new和delete操作符处理原始内存,而不是构造的对象

当你做A*p=新A

呼叫新操作员,然后。。。 然后通过返回的内存地址调用构造函数的对象,然后。。。 最后,地址被转换成A*并被赋予p。 同样,当您删除p

调用析构函数,然后。。。 内存地址将提供给操作员delete,并返回给系统。 在这两种情况下,对象实例的状态及其成员的值均未定义:

在操作符内部,无论您做什么,都将被后续的构造函数调用覆盖。如果构造函数没有初始化某些东西,标准会说它的值是未定义的,并且不允许与您在new中设置的值相同。 在操作符内部,删除您在已经死亡的对象上执行的任何操作,并且您在其中发现的内容不被授予最后一个活动状态。
在任何情况下,当您调用delete时,对象都会死亡。在销毁后调用的运算符delete期间,无法将其从死状态保存。它的目的是放置墓碑,而不是使尸体复活。

您正在这样做:尝试AB::Object*ptrObj5=obj1&obj1;你会知道原因的。我认为你在这里做的是一个非常糟糕的主意。运算符&用于参考计数将导致悲伤。因为这是一个不完整的解决方案。特别是当您从操作符返回原始指针时。至少,返回一些可以减少销毁时的引用计数的内容。但是重载操作符地址的问题是,它使处理对象变得烦人。还有,普通引用而不是指针呢?我可以说Object&or=*somePointer,但你不能跟踪它。基本上,这个方案中有太多的漏洞要钻,以至于你要花所有的时间调试引用计数错误。如果必须这样做,那么您的设计是有缺陷的-&应该返回一个智能指针,该指针基于侵入性引用计数(std::enable_shared_from_this)或自定义解决方案。不要重载运算符new和delete,这不是这些重载的目的-相反,隐藏构造函数并提供静态智能\u ptr CreatePtr Args&&。。。args包装器。请注意,自动存储中或其他非垃圾收集对象中不能存在垃圾收集对象,因此此设计会导致性能下降;你会知道原因的。我认为你在这里做的是一个非常糟糕的主意。运算符&用于参考计数将导致悲伤。因为这是一个不完整的解决方案。特别是当您从操作符返回原始指针时。至少,返回一些可以减少销毁时的引用计数的内容。但是重载操作符地址的问题是,它会让工作变得烦人
用这个物体。还有,普通引用而不是指针呢?我可以说Object&or=*somePointer,但你不能跟踪它。基本上,这个方案中有太多的漏洞要钻,以至于你要花所有的时间调试引用计数错误。如果必须这样做,那么您的设计是有缺陷的-&应该返回一个智能指针,该指针基于侵入性引用计数(std::enable_shared_from_this)或自定义解决方案。不要重载运算符new和delete,这不是这些重载的目的-相反,隐藏构造函数并提供静态智能\u ptr CreatePtr Args&&。。。args包装器。请注意,自动存储中或其他非垃圾收集对象中不能存在垃圾收集对象,因此此设计会导致性能下降。此外,您可能需要常量和非常量重载。这是一个非常量,您还需要返回常量对象的常量*@sftrabbit,@Sebastian Redl谢谢!除此之外,请注意重载运算符&通常是一个坏主意,并且不能在标准容器中使用重载一元的类型。此外,您可能同时需要常量和非常量重载。这是一个非常量,您还需要返回常量对象的常量*@sftrabbit,@Sebastian Redl谢谢!除此之外,请注意重载运算符&通常是一个坏主意,并且不能在标准容器中使用重载一元的类型。。。
Object *Object::operator& (){
    ++(this->ptrCount);
    std::cout << "Counter is increased." << std::endl;
    return this;
}