Ven*_*esh 7 c c++ oop overloading
我知道在C中不可能进行重载,我想知道:为什么类中的重载函数和类外部在C++中处理相同?
在C++中考虑这种情况,其中函数在类外声明:
foo()
foo(char c)
foo(int a, int b)
Run Code Online (Sandbox Code Playgroud)
如果C++将每个函数头视为唯一,为什么C不能这样做呢?
我认为这些可能是原因:
C中是否存在函数重载不可用的原因?
也许最重要的原因是缺乏现有技术.标准委员会向C添加的功能的例子非常少,既没有流行的扩展,也没有必要编写严格符合的代码.
有一些模糊定义的"C精神",C99基本原理(V5.10)读取(第3页,emph.mine):
C精神的一些方面可以概括为以下短语:
- 相信程序员.
- 不要阻止程序员做需要做的事情.
- 保持语言小而简单.
- 只提供一种方法来进行操作.
- 即使不保证便携,也要快速.
此外,C努力保持向后兼容旧版本; 例如,旧式声明在C89中已被标记为过时,但仍然是C11的一部分.同上,第2页:
现有代码很重要,现有实现则不然.大量的C代码存在相当大的商业价值.我们已尽一切努力确保符合标准的任何实现都能接受大部分代码.C89委员会不希望强迫大多数程序员修改他们的C程序,只是为了让他们接受合格的翻译.
C和C++中的一些差异至少部分是由函数重载引起的,例如字符常量的类型:
int foo(int);
int foo(char);
...
foo('x');
Run Code Online (Sandbox Code Playgroud)
在C++中,这个调用foo(char),但在C中,类型'x'是int,所以结果可能相当令人惊讶,或者'x'需要是类型char,可能会破坏现有代码.此外,你可能想一些促销活动,他们是有意义的,例如,如果在最后一个例子中,第二个声明foo中没有给出,'x'会被提升到int与foo(int)被调用.这些规则可能会变得很复杂(应该void *隐式转换为函数调用?).(这不是一个很难的数字,但是关于n3797草案中C++标准(第13章)中函数重载的章节大约有30页,同上.5.2.2关于函数调用的内容比相应的C标准部分要长得多.)
几乎C的每个特征都是最小语言所必需的(好的,模数历史遗产),语法糖很少; 函数重载可以考虑这样的(你能说出你的职责foo_int和foo_char等,并明确调用正确的).
你建议的原因是循环的(因此不适用):C确实采用了一些C++特性(例如函数原型); 函数重载是在C++中引入的,因为C缺少它(你不能说"它不是C的一部分,因为它是C++的一部分;它是C++的一部分,因为它不是C的一部分").关于C和OOP的第二个建议也是如此.
我个人对C的看法是它与机器的关系非常接近.通常很容易看出C代码生成的汇编器输出与它有什么关系.符号名称是非符号的,可以很容易地识别.语言简单易懂.坦率地说,当他们想要将某些C++特性结合到C中时,我不明白人们的追求:我们有C++,一种提供这些东西的语言,能够编写特定于平台的高效代码; 为什么不用它呢?
C11介绍_Generic,可能对您有用.
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |