面向对象的概念是否适用于C语言?

时间:2014-02-11 12:04:50

标签: c# c oop overloading

在C#中,我们了解到当多个函数具有相同的标识符但签名不同时会发生函数重载。

虽然函数重载的概念是面向对象语言的,但在以下观察的基础上是否也适用于C语言?

printf("%d", 3);

printf("%d + %d = %d", 1 , 2 , 3 );

第一个printf只传递两个参数。 第二个printf传递了四个参数。

这是否意味着printf过载?

5 个答案:

答案 0 :(得分:6)

没有printf没有超载。在C中没有函数重载或任何其他面向对象的优点。 printf的工作方式是使用参数列表。看一下这篇文章http://www.cprogramming.com/tutorial/c/lesson17.html

答案 1 :(得分:3)

printf系列函数不使用重载,而是使用可变数量的参数。

C中不支持函数重载和覆盖(即C#中的虚方法),它甚至没有成员函数。

然而,它们可以通过函数指针来模仿。这是例如在X Window系统的实现中采用的方法。

答案 2 :(得分:2)

了解variadic functions

printfscanf函数族是可变函数。

有用的链接:

  1. Cprogramming.com

  2. Writing Variadic Functions

  3. 要完成答案:C不支持函数重载。

答案 3 :(得分:2)

没有printf不是其他人已经说过的函数重载的示例,它使用stdarg.h中的功能。但是很多人似乎都不知道,C有一些函数重载。

  • 因为C99 C在tgmath.h中具有“类型通用数学函数” 你需要计算floatdouble sin,具体取决于 你要传递的论据
  • 因为C11具有_Generic,这是一个比函数重载更强大的功能,除了其他功能外,还可以用来编写实现重载功能的类似函数的宏

而且,所有这些都与OO编程无关。

答案 4 :(得分:0)

函数重载是与面向对象设计完全分离的语言特性。仅仅因为它往往存在于具有OO功能的语言中,所以也不会使它成为OO功能。

OO设计的基石是:对外部世界有限的自治类(“松散耦合”),数据/方法的私有封装和继承/多态。

其他与上述不相符的功能只是一些额外的毛茸茸。函数重载和运算符重载是两个如此蓬松的东西 - 有许多OO语言不支持这两个特性。

对于printf,它使用C语言的icky变量参数功能。我不会称这个函数重载,而是在70年代引入的一些旧的特殊垃圾,以便C可以吹嘘有可变数量的参数。至少可以说是一种温和有用的功能。它不用于任何理智,生产质量的代码。