C与C++函数的不同特性

原创 2007年10月09日 23:03:00

        C与C++函数最大的不同点在于——C++函数可以重载,即几个函数的函数名可以相同,但是参数类型或参数个数必须不同;而C函数在一个环境中不能同名。这其中可以引申出关于为什么C++的类型安全机制比C更好的原因。先请看下面的代码:

 

// a.c

#include 
<stdio.h>


void Hi(void)
...{
    puts(
"Hi");
}



void test(void)
...{
    
void *= &Hi;
    
    (
*(void(*)(void))p)();
}

         上面是一段C代码。我们可以看到test()函数中有一个void指针指向Hi函数,这不会有任何问题(没有error和warning)。

        下面再看一段C++代码:

 

#include <iostream>
using namespace std;


void Hello(void)
...{
    cout 
<< "Hello, world!" << endl;
}



void Hello(int i)
...{
    cout 
<< "The data is: " << i << endl;
}



extern "C" void test(void);

int main(void)
...{
    
void(*p)(void= &Hello;
    
    (
*p)();
    
    
void *= (void*)(unsigned long)(void(*)(int))&Hello;
    
    (
*(void(*)(int))q)(10);
    
    test();
    
    
return 0;
}


 

        我们看到这段代码中有两个Hello()函数,一个带有一个类型为void的参数,而另一个带有一个类型为int的参数。我们看main()函数的第一句:void(*p)(void= &Hello;这句语句没有问题。因为C++编译器与C编译器不同,在这种情况下,编译器将根据左操作数的类型去跟有操作数的类型进行比较,因为Hello()函数集合中确实存在(void(*)(void))类型的函数,因此匹配成功。

        如果是void *p = &Hello;那么编译器肯定出错。我们可以简单地理解为编译器无法识别所取的Hello函数的地址到底是哪一个。其实利用上述思路我们应该正确地理解为:由于编译器无法在Hello集合中找到void*类型与左操作数的类型进行匹配,所以编译器会报错。

        解决这个问题的方法就是通过多次的类型强制转换。这里还有一个GCC系列编译器的问题。该系列的编译器规范指出,void*类型的指针不能指向函数,因此如果单纯地强制转为(void(*)(int))编译器会有warning,所以这里先转为(void(*)(int)),然后再转为(unsigned long),最后再转为(void*),这样就不会产生warning。

        而C语言编译器不会有类型查找,它直接比较左操作数和有操作数的类型一致性问题,并且放得很宽。

C和C++中泛型编程 - 适应不同类型参数的函数

首先一个简单的问题,如何实现交换两个整数的值? 想必每个有编程经验的人都能作答。 C语言用指针实现如下: void swap(int * a, int * b){ int tmp = *a...
  • u010666109
  • u010666109
  • 2014年05月19日 21:34
  • 1885

C++语言的三大特性

又重新看了一个多月的书,也算是基本上了解了一些很基础的东西,学习C++就得掌握它所具备的三大特性。         封装性是基础,继承性是关键,多态性是补充,并且多态性存在于继承的环境中。    ...
  • erlian1992
  • erlian1992
  • 2015年03月08日 18:38
  • 5722

理解C++三大特性

封装,继承,多态      封装可以隐藏实现细节,使得代码模块化,继承可以扩展已存在的模块,它们目的都是为了:代码重用。而多态是为了实现另一个目的:接口重用。 什么是多态?   ...
  • Doo66
  • Doo66
  • 2016年08月15日 10:26
  • 4955

C++ ——三大特性理解

1.封装 突破了C语言函数的概念,封装可以隐藏实现细节,使得代码模块化。2.继承 继承可以扩展已存在的代码模块(类);达到代码重用的目的。要实现继承,可以通过“继承”(Inheri...
  • michael019
  • michael019
  • 2015年10月01日 10:03
  • 1854

VS开发】C中调用C++文件中定义的function函数

【VS开发】C中调用C++文件中定义的function函数标签(空格分隔): 【VS开发】声明:引用请注明出处http://blog.csdn.net/lg1259156776/精要一揽C调用C++,...
  • LG1259156776
  • LG1259156776
  • 2015年12月04日 18:51
  • 1882

C++四大特性——多态 的总结

我们都知道,C语言和C++的区别就是,C语言是面对过程的程序设计,而C++是面对对象的程序设计。面对对象的程序设计有4大特性:分别是,抽象、封装、继承、多态。今天我们就来总结一下多态的内容。多态:分为...
  • jhcconan614
  • jhcconan614
  • 2017年03月11日 15:26
  • 980

如何在QT中实现C语言中调用C++的函数

通常在嵌入式的编程中,许多控制底层的代码都是用C语言写的。如果要实现在C语言中直接调用函数就可以控制QT/C++写的界面这样的一个效果,我们立刻进入正题! 下面我们实现一个Demo,要实现在C文件中调...
  • qq_22237829
  • qq_22237829
  • 2016年08月25日 18:25
  • 669

C语言实现C++面向对象语言多态特性

我们知道,C++语言演化过程中,加入了不少新特性,使其成为一门现代高级OO语言。当初C++在上个世纪七十年代末,80年代初时,C++发展刚刚起步,那时C++可以看作C with class,C++编写...
  • sunjunior
  • sunjunior
  • 2016年03月09日 21:02
  • 1214

c/c++程序main函数参数解析,以及参数传递的不同方法

1. 程序运行时传递参数的不同方法:    1)通过命令参数传递参数; 2) 通过txt文件读取参数。 2. 方法举例 1)通过命令参数传递参数,即解析main函数的参数。     main函数可以不...
  • jfr664034354
  • jfr664034354
  • 2017年01月16日 16:25
  • 1135

c++11的10个新特性

C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布[2]  ,并于2011年9月出版。...
  • whatday
  • whatday
  • 2016年01月13日 11:38
  • 853
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C与C++函数的不同特性
举报原因:
原因补充:

(最多只允许输入30个字)