Pointers 使用重载运算符取消对对象指针的引用

Pointers 使用重载运算符取消对对象指针的引用,pointers,object,operators,Pointers,Object,Operators,因此,我有一个带有重载postfix++运算符的类。我想在动态分配的对象上使用该操作符,如下所示。然而,我只找到了两种选择,它们似乎都不正确。我觉得我错过了一些操作符重载之类的大问题。有没有更正确/优雅/干净的方法?我知道这些都是非常固执己见的话。。。我一直在寻找一段时间,但我的知识C++是相当有限的相比,大多数人在这些论坛。谢谢 Date * today = new Date(); today->operator++(); //option 1 (*today)++; //optio

因此,我有一个带有重载postfix++运算符的类。我想在动态分配的对象上使用该操作符,如下所示。然而,我只找到了两种选择,它们似乎都不正确。我觉得我错过了一些操作符重载之类的大问题。有没有更正确/优雅/干净的方法?我知道这些都是非常固执己见的话。。。我一直在寻找一段时间,但我的知识C++是相当有限的相比,大多数人在这些论坛。谢谢

Date * today = new Date();

today->operator++(); //option 1

(*today)++; //option 2

首先,你的两个选择并不等同。选项1调用运算符++的前缀形式,选项2调用后缀形式。这样,就可以选择一个同等的备选方案2

++(*today);
一般来说,假设Date类的这些运算符是按惯用方式实现的,我更喜欢这种形式,因为后缀形式引入了临时形式,而前缀形式不会

哪个更优雅,哪个更干净?这是主观的。不同的人有不同的意见

但是,您的示例使用了指针和动态内存分配操作符new。这会导致内存泄漏,除非使用运算符delete显式释放对象。在许多C++指导中,这是积极劝阻的注释:这可能被认为是其他一些编程语言中的好技术,但一般不与C++。 我将使用的方法是简单地定义Date类型的对象,而不是指针

Date today;    // look ma!   This is not a pointer.

++today; //option 2, but prefix form
通过这个简单的更改,不需要显式地取消引用任何指针,而且因为只有一个操作,所以不需要额外的大括号来分组。它还有一个优点,即今天的对象在超出范围时(例如,当函数返回时)将被隐式释放,因此这种技术不会导致内存泄漏


这使事情变得更简单,可能会被认为更干净、更优雅。

感谢您的回复!对不起,我的意思是这两种说法是等价的。是的,声明一个对象而不是指向一个动态分配对象的指针会使语句更干净,但这不意味着该类随后会被分配到堆栈吗?我不认为我会想这样做,然后你会使用比你需要的更神秘的语法,从20世纪80年代开始强加一个很大程度上武断和不必要的限制。虽然有不同之处,但是避免堆栈的好处很少有意义,而且你在C++中放弃了很多,坚持动态分配你的对象来使用堆。如果必须,请在C++11之前使用std::auto_ptr或来自C++11的std::unique_指针。使用对象的语法相同,但它们会自动释放-因为auto_ptr/unique_指针在堆栈上。谢谢,你帮了大忙。如果我有代表,我会+1。我想在堆上创建我的对象的原因是因为我计划在某个时候制作一个游戏,并且希望避免堆栈溢出。如果你不介意的话,告诉我这是否仍然没有必要。我觉得从书本学习C++和真实世界C++中获得的唯一方法就是尝试和错误。我从C++开始读过一本Gaddis的书:从控制结构到对象,我浏览了learncpp.com,到处都是一些小东西。还有其他建议吗?再次感谢你,罗伯。这取决于你的游戏,但通常是不必要的。如果使用SizeOfoObject测量很多非常大的对象,可能会耗尽内存。这是真的,因为堆栈和堆限制都更大。诀窍是避免创建或复制任何对象,除非必要。保持你的代码简单,让它正确。如果测试显示有问题,那么可以求助于堆。使用标准C++容器STD::vector、string等,因为它们可能比你更有效地管理对象集合——但是避免创建比你需要的更多的对象集合。