注意:答案是按照特定的顺序给出的,但由于许多用户根据投票而不是给出的时间对答案进行排序,因此这里是答案的索引,它们是最有意义的顺序:
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
从C++到Java,明显没有答案的问题是为什么Java不包含运算符重载?
是不是Complex a, b, c; a = b + c;比简单得多Complex a, b, c; a = b.add(c);?
是否存在已知的原因,有效的论据,不使运算符重载?这个理由是武断的,还是输给了时间?
Please take note of the updates at the end of this post.
Update: I have created a public project on GitHub for this library!
I would like to have a single template that once and for all takes care of pretty-printing all STL containers via operator<<. In pseudo code, I'm looking for something like this:
template<container C, class T, String delim = ", ", String open = "[", String close = "]">
std::ostream & operator<<(std::ostream & o, const C<T> …Run Code Online (Sandbox Code Playgroud) 假设我有一个类,其成员名为data,这是一个列表.
我希望能够使用例如文件名(包含初始化列表的数据)或实际列表来初始化类.
你这样做的技巧是什么?
你只是看看类型__class__吗?
我可能会缺少一些技巧吗?
我已经习惯了C++,其中按参数类型重载很容易.
我学习C++操作符重载,我看到==和!=仅仅是可定制的用户定义类型的一些特殊功能.但我担心的是,为什么需要两个单独的定义?我认为如果a == b是真的,则a != b自动为假,反之亦然,并且没有其他可能性,因为根据定义,a != b是!(a == b).我无法想象任何情况都不是这样.但也许我的想象力是有限的,或者我对某些东西一无所知?
我知道我可以用另一个来定义一个,但这不是我要问的.我也没有询问按价值或身份比较对象之间的区别.或者两个对象是否可以同时相等且不相等(这绝对不是一个选项!这些东西是相互排斥的).我问的是这个:
是否有任何情况可以提出有关两个对象相等的问题是否有意义,但是询问它们不相等是没有意义的?(无论是从用户的角度,还是从实施者的角度来看)
如果没有这种可能性,那么为什么地球上C++会将这两个运算符定义为两个不同的函数?
我想在一个类中添加一个运算符.我目前有一个GetValue()方法,我想用[]运算符替换.
class A
{
private List<int> values = new List<int>();
public int GetValue(int index) => values[index];
}
Run Code Online (Sandbox Code Playgroud) 在Stack Overflow问题中,在C++ 11中不允许重新定义lambda,为什么?,给出了一个不编译的小程序:
int main() {
auto test = []{};
test = []{};
}
Run Code Online (Sandbox Code Playgroud)
问题得到了回答,一切似乎都很好.然后是Johannes Schaub并做了一个有趣的观察:
如果你
+在第一个lambda之前放置一个,它会神奇地开始工作.
所以我很好奇:为什么以下工作呢?
int main() {
auto test = +[]{}; // Note the unary operator + before the lambda
test = []{};
}
Run Code Online (Sandbox Code Playgroud)
例如,DataGridView允许您执行此操作:
DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];
Run Code Online (Sandbox Code Playgroud)
但对于我的生活,我找不到索引/方括号运算符的文档.他们怎么称呼它?它在哪里实施?可以扔吗?我怎么能在自己的课上做同样的事情?
ETA:感谢所有快速解答.简而言之:相关文件属于"项目"属性; 重载的方法是声明一个属性,如public object this[int x, int y]{ get{...}; set{...} }; 至少根据文档,DataGridView的索引器不会抛出.它没有提到如果提供无效坐标会发生什么.
再次ETA:好的,即使文档没有提到它(顽皮的微软!),事实证明,如果你为它提供无效的坐标,DataGridView的索引器实际上会抛出一个ArgumentOutOfRangeException.公平的警告.
我正在用C++编写一个小矩阵库来进行矩阵运算.然而,我的编译器抱怨,在它之前没有.这个代码留在架子上6个月,在我之间我将我的计算机从debian etch升级到lenny(g ++(Debian 4.3.2-1.1)4.3.2)然而我在具有相同g ++的Ubuntu系统上遇到了同样的问题.
这是我的矩阵类的相关部分:
namespace Math
{
class Matrix
{
public:
[...]
friend std::ostream& operator<< (std::ostream& stream, const Matrix& matrix);
}
}
Run Code Online (Sandbox Code Playgroud)
而"实施":
using namespace Math;
std::ostream& Matrix::operator <<(std::ostream& stream, const Matrix& matrix) {
[...]
}
Run Code Online (Sandbox Code Playgroud)
这是编译器给出的错误:
matrix.cpp:459:错误:'std :: ostream&Math :: Matrix :: operator <<(std :: ostream&,const Math :: Matrix&)'必须只取一个参数
我对这个错误感到有些困惑,但是在6个月里做了大量的Java后,我的C++又变得有点生疏了.:-)
[]在Python中覆盖类的运算符(下标表示法)的方法名称是什么?
c++ ×6
c# ×2
c++11 ×2
operators ×2
python ×2
c++-faq ×1
collections ×1
constructor ×1
equality ×1
indexer ×1
iostream ×1
java ×1
lambda ×1
namespaces ×1
ostream ×1
pretty-print ×1
templates ×1