我想在队列中存储一串字符串.如果我使用成员函数,这似乎很简单push()
queue test;
string s0("s0"), s1("s1");
test.push(s0);
test.push(s1);
Run Code Online (Sandbox Code Playgroud)
我正在考虑以隐式方式在队列中添加字符串.这意味着,如果我键入以下字符串序列,则operator >>应该将队列中的字符串值推送出来.
queue test;
string s0("s0"), s1("s1");
s0 >> s1 >> s2 >> s3 ;
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
sbi*_*sbi 16
虽然C++不允许你这样做,它允许你做一些非常相似的事情:test << s0 << s1;但是,不要这样做!
如果我看到test.push(s0),我确切地知道它的作用,甚至没有看到它的类型test.如果我看到test << s0 << s1;,我认为test是一个写入的流.
这是我在重载运算符时应遵循的三个基本规则:
+运算符的代码来更改其右操作数.但是,这样的运算符的用户永远不会怀疑表达式a + b改变了值b.这就是为什么运算符重载的第二条规则说:始终坚持运算符的众所周知的语义.(反过来,这假定语义是无可争议的;请参阅先前的规则.) a + b,用户也可以打电话a += b.如果它支持前缀增量++ a,那么他们也希望++能够工作.如果他们可以检查是否a < b,他们肯定也希望能够检查是否a > b.如果他们可以复制构造您的类型,他们希望分配也可以工作.因此,运算符重载的第三条规则提醒您:始终提供一组相关操作. 与所有此类规则一样,确实存在例外情况.有时人们偏离了它们,结果并不是错误的代码,但这种偏差很少而且很远.至少,我所看到的100个这样的偏差中有99个是没有道理的.然而,它可能只有1000中的999.所以你最好坚持这些规则.
所以万一我还不够清楚:对于你问题的代码,偏离这些规则是非常糟糕的.
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |