【发布时间】:2017-01-13 04:32:10
【问题描述】:
今天我试图理解这个与 operator 及其重载有关的东西。
让我们看看这段代码:
cout.operator<<("hello"); // +16 overloads -> implicit conversion to void*
cout.operator<<(123); // +16 overloads
operator<<(cout,"hello"); // +13 overloads
operator<<(cout, 123); // ERROR: no overload
cout << "hello"; // +13 overloads ---> non-member version!
cout << 123; // +16 overloads ---> member version!
感谢 Visual Studio 的 Intellisense,我可以检测每个它可以提供多少重载。
我得出结论:
- 非成员运算符13
- 成员运算符16
我得到了这些问题:
从最后两行可以看出,当使用带有 const char[] 的 cout 时,会选择非成员重载。
- 为什么没有成员运算符
另外,在第四行我们得到一个错误,因为没有非成员运算符
- 为什么没有接受整数的非成员运算符
最后但并非最不重要的一点
-
cout << “hello”为什么选择非会员版运营商
可能是因为有一个特定的非成员运算符是 const char[] 的良好候选者,而不是成员运算符无效*?
【问题讨论】:
-
为什么重要?
-
因为我正在深入学习语言并想了解更多,也许吧?
-
我真的很惊讶以前没有人问过这个问题。没有受骗的迹象。不过,对于工作组的邮件列表来说,这似乎是一个更好的问题;这里没有实际问题需要解决。您只是想知道为什么 IOStreams 的一些
operator<<是成员,而一些是免费函数。 -
这背后没有什么伟大的设计,只是一些运营商一直是会员 - 一直以来。添加新的非成员比添加成员要容易得多。无论如何,它们对
cout << x;的工作方式相同。 -
13 和 16 代表什么?
标签: c++ operator-overloading iostream