C++操作者技术
回答
一个很难的事情有关C++和运算符重载是,它可以是某种双关语的。重载分配创建了一个位,且auto_ptr
咸菜的,因为试图采取“转让”是理所当然的是感到吃惊通过分配A到B,然后后来马上发现一个码!= B.
http://hostilefork.com/2009/07/10/smart-pointer-casting-study/
我将指出,如果下面的通用代码可以编译,一类的用户往往会认为它不会断言:
SomeType foo (...);
SomeType bar (foo);
foo++; // let's say we know this is safe
foo--; // then we'd generally hope this is safe also
assert(foo == bar); // ...and this is true
有没有执法,虽然。有些人直言不讳它是坏的要容忍这样的语义免费为所有:
http://yosefk.com/c++fqa/operator.html
我向他说,以保持其中的一些期望是非常重要的倾斜。但是,如果不编译一个程序,那么递减不应该有意义。向前迭代器被提到,完美的例子。
你用语言获得的基础性事物往往是非常“数学”和“对称的”(就像一个整数不可能有加法但不是减法)。但我认为正在针对特定问题量身定制的课程趋向于从不对称获得更大价值。
这是一种普遍性vs特异性的东西。考虑一个靠近用户的应用程序。他们不希望所有的东西都是平等的,更常见的操作应该是“容易的”,而偶尔的操作可能会被边缘化。一些最令人沮丧的软件是不关注常见情况的软件。那些解决问题的专门课程往往不如通用语言结构或图书馆对称。
优秀的答案深度。你的评论'//然后我们一般会希望这是安全的'也强调了这样一个事实,即可能相反的运营商应该声明**,但**(并且一个大但在那里)是私人的,所以如果用户试图打电话它,他们明确知道即使说++,它也不是一个有效的命令。 – SSight3
很高兴你喜欢它,我希望有更多机会在StackOverflow上进行哲学蜡染。 :)至于宣布私事vs.没有声明,我一般认为这对于禁用默认设置(如默认拷贝构造函数)很有用......对于++/case,你有什么不同? – HostileFork
我认为哲学讨论对于扩展知识是有用的。我在考虑更多的是禁用++/- ,但是,++/- 在默认情况下是禁用的 - 所以也许要告诉用户你知道这个函数,但是它被有意地禁用了? – SSight3
我不认为如果你声明一个运营商(说operator ++()
),那么你必须申报另一个(operator --()
)。它总是在需要的基础上。如果你需要operator --()
然后申报。
用户自然地承担其应对面工作
有些情况下,这种说法是不正确的。例如,你的程序正在每隔一小时通过并做一些事情。这里只有operator ++()
可以适用。 operator --()
甚至不可能。
为什么?甚至连标准的前向迭代器都没有:-)
为什么?如给出的,如果用户认为他们可以使用++,他们应该有 - 。同样,如果你有+ =你应该有 - =(我注意到这个词应该)。该建议在应该支持它的类的上下文中是有意义的。我很好奇为什么有一个单向迭代器?我将添加上面提供的建议是对我设计的特定类设计的反驳,所以看到对非对称设计的支持很有趣。 – SSight3
@ SSight3:例如'istream_iterator'是单向的,因为你不一定倒回输入流。特别是它是一个InputIterator,甚至不是ForwardIterator。 –
@ SSight3:有单向迭代器,因为有容器(或类似容器的对象)不能反向迭代。像单链表和一些类型的流。 –
我会说这个建议是不准确的。
反例是一个前向迭代器。例如,单链表上的迭代器不能倒退,所以operator - ()将不起作用。
这在很大程度上取决于类的语义。例如,前向迭代器将始终定义运算符++,但不会运算符。
如果它使多大意义,因为它确实减小数字递增的东西,那么我同意与原来的说法,但也有一定的情况下,其中一个有意义,其他没有。
为运营商提供时,你可以得到的最重要的建议是,编程是关于建模域,你应该做的无论是在你的域自然。如果在您的域中,该类型建模的对象可以同时递增和递减,那么如果在域中只有一个操作存在,那么您的设计应支持这两种操作,然后在设计会混淆您的用户。
编程不是关于在编译器中抛出代码,以便它可以执行,而是解决特定问题。考虑手头的问题,并以最自然的方式从那里开展工作。并且整体遵循Principle of least astonishment,因为这会使您的界面更容易正确使用,并且难以正确使用。
- 1. C#模拟技术
- 2. C++技术新手
- 3. Node.JS工作技术
- 4. C#的技术分析Math.Round
- 5. C#中的别名技术?
- 6. Java Socket技术作家
- 7. 背景工作者是否有限制?技术或常识
- 8. 使用UI技术的网络技术
- 9. C/C++程序的API。哪种技术?
- 10. Haskell中廉价列表操作的最新技术状态?
- 11. 正则表达式和字符串操作技术
- 12. iPhone的图片操作/过滤库技术
- 13. 针对不同操作系统的语义技术
- 14. 使用HTML5技术操作和上传表单文件数据
- 15. C编程!算术运算符操作
- 16. HTML5技术
- 17. .NET“推”技术?
- 18. GetDeviceCaps技术
- 19. 跟踪技术
- 20. 分类技术
- 21. ajax技术
- 22. Mongomapper - bootstrapping技术
- 23. WPF技术栈
- 24. Java WebService技术
- 25. AS3 - Autocrop技术?
- 26. Sharepoint技术
- 27. 猜测技术
- 28. 解决技术
- 29. openmp reduce技术
- 30. Android NFC技术
当你在谈论比较运算符(< > ==等)时,这对我来说肯定是有意义的,以便任何比较都可以工作。但对于++和 - ,你可能有理由只实现其中的一个。 – crashmstr
确实。我曾经遇到过需要添加单一功能的情况。只是想看看是否有更多的细节参考,因为这是一个有效的设计建议。 – SSight3