c和c++的区别(一)

主要讨论c89版本和c++99版本修订后的区别

1.带有默认值的函数(c++支持,C语言不支持)

例:

int sum(int a,int b=10)
{
	return a+b;
}
int main()
{
	int a = 10;
	int b =0;
	sum(a,b);(1)
	/*
mov         eax,dword ptr [b]  
push        eax  
mov         ecx,dword ptr [a]  
push        ecx  
call        sum (09A10D7h)  
add         esp,8  
*/
	sum(a); (2)
	/*
push        0Ah  
mov         eax,dword ptr [a]  
push        eax  
call        sum (09A10D7h)  
add         esp,8  
*/
	sum(a,30); (3)
	/*
push        1Eh  
mov         eax,dword ptr [a]  
push        eax  
call        sum (09A10D7h)  
add         esp,8  
	*/
}

从反汇编上来讲,C++支持传默认值,当(1)和(2)相比时,不给参数时节省了调用mov指令的调用,提交了效率,节省了时间。(2)(3)相比并没有区别提高效率。

编译时从上到下编译,类似

例1:int sum(int a ,int b=20);(1)

        int sum(int a =10 ,int b);(2)

可以编译成功,因为在编译a时,b已经完成了编译。若(1)(2)位置互换,不能编译成功,因为默认值时要从右向左给。

例2:int sum(int a,int b=20);

        int sum(int a,int b=20);

声明可以有很多个,因为声明不占内存,不产生符号。声明可以给默认值,但是一个形参只能给一次默认值,否则会产生重定义默认值错误。

 

2.内联函数

2.1 inline函数和宏的区别

宏是在预处理阶段进行字符替换。而inline函数在函数的调用点把函数的代码全部展开,会在编译阶段进行类型检查,更安全,所以也叫做一种更安全的宏。

2.2 inline函数和普通函数的区别

(1)内联函数没有标准的函数栈帧的开辟和回退,效率高

普通函数有

   如果函数调用的开销  >  函数执行的开销

   (栈帧的开辟和回退)>(此例中的return  a+b)

这个时候使用内联函数更好更省时

注:inline函数一般都写在原文件中,只能在本文件可见,其他文件不能调用。也可以写在.h文件中

2.3 inline函数和static函数的区别

   (1)栈帧开辟回退。static有正常的栈帧开辟和回退,inline没有

   (2)符号产生。static产生符号,inline不产生符号

2.4普通函数和static函数的区别

   产生符号的属性,static产生local的符号,链接器不处理。普通函数产生global的符号,链接器对其进行符号的解析=》给符号分配内存虚拟地址=》对符号进行重定位。(objdump  -t main.o可查看符号表)

注:inline函数只在release版本起作用。在debug版本里,inline函数的调用也需要栈帧的开辟和回退。inline函数只是对编译器的一个建议,最终能不能处理成inline函数由编译器决定,递归函数只有在函数运行时传入实参才能知道形参是多少,编译时并不知道,也不知道要展开多少次,所以不能处理成inline函数。

3.函数重载

C语言中,函数产生符号由函数名称决定,不支持重载的函数

C++中,函数产生符号由函数名称+形参类型+形参个数决定

例:

bool campare(int a,int b)
{
	cout<<"campare(int a,int b)"<<endl;
	return a>b;
}
bool campare(double a,double b)
{
	cout<<"campare(double a,double b)"<<endl;
	return a>b;
}
bool campare(char* a,char* b)
{
	cout<<"campare(char* a,char* b)"<<endl;
	return a>b;
}

在C中,生成的符号都是campare,

在C++中生成的符号为compare_int_int、compare_double_double、compare_char*_char*


此外,这里可以引出静多态和动多态的区别???

静多态:函数的重载、模板

动多态:继承里的多态(虚函数)

关于函数重载:

1).函数名相同,参数列表不同(生成符号不同)的函数称作一组重载的函数,他们之间是重载的关系。不能仅通过返回值不同确定重载关系,符号的产生和返回值没关系。

2).重载必须处于同一个作用域之内才能构成重载

3).

补充:默认类型转换:

 

4.c/c++相互调用

extern “C”//里面内容的符号按照C语言的规则产生

{

   int sum(int a,int b);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值