C和C++的区别:
一、默认值:
C语言(C89)不支持带有默认值的函数
C++(C++99)支持带有默认值的函数:要从右到左,给形参,默认值。
那么什么是带默认值的函数呢?
int sum(int a=10,int b=20)
{
return a+b;
}
int main()
{
int c=sum();
return 0;
}
这就是传说中的带默认值的函数,它的实参不是通过函数调用传递的而是通过在定义或声 明函数时在函数体内给出的默认实参。如果再从函数调用中给出实参则默认实参将被覆盖,失去其意义。
而且带默认值的函数的参数还是有一定限制的,函数传参是从左至右依次传递参数,如果从左至右前面有默认值,后面没有就会发生错误。例如:
int sum(int a=10,int b)
{
return a+b;
}
int main()
{
int c=sum(20);
return 0;
}
上面的代码就是错误代码,会显示: error C2548: “sum”: 缺少参数 2 的默认参数
error C2660: “sum”: 函数不接受 1 个参数
所以,我们使用带默认值的函数时一定要注意调用参数与函数默认值的匹配,避免出现上面代码出现的错误。
二、inline函数:
C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般的,用户可以阅读函数的声明,但是看不到函数的定义。
inline函数与普通函数的区别:
inline函数相当于C语言中的宏,调用inline函数就相当于宏替换,把inline函数中的代码复制过来,不重新开辟栈空间。内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接呗镶嵌到目标代码中
inline函数与宏#define的区别:
宏定义使用预处理器实现,做一些简单的字符替换因此不能进行参数有效性的检测。另外它的返回值不能被强制转换为可转换的合适类型,且C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作。
(1)内联函数在编译时展开,宏在预编译时展开;
(2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换;
(3)内联函数有类型检测、语法判断等功能,而宏没有;
(4)inline函数是函数,宏不是;
(5)宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义;
三、函数重载:
C语言不支持函数重载,
C++支持函数重载
那么什么是函数重载呢?
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。
两个重载函数必须在下列一个或两个方面有所区别:
1、函数有不同参数。
2、函数有不同参数类型,
C++的这种编程机制给编程者极大的方便,不需要为功能相似、参数不同的函数选用不同的函数名,也增强了程序的可读性。
int sum (int a,int b)
{
return a+b;
}
float sum(float a,float b)
{
return a+b;
}
int sum(int a)
{
return a;
}
上面的代码就是利用函数重载,将三个函数名相同的,形参类型不同或个数不同的函数定义在同一段程序中。
四、c与c++的相互调用:
说了这么久的c和C++的区别,我们还不知道c和c++之间能不能相互调呢?
答案是可以也不可以。
为什么是可以也不可以呢?因为c语言是面向过程的一门高级语言,c++是面向对象的高级语言,在同一个编译器编译.c文件和.cpp文件的时候会生成不同的符号,那么在相互调用时会因为符号无法识别或识别错误就会导致代码错误。
那么,为什么又是可以呢?这里就要提到extern关键字和中间接口文件。
例如:在一个.cpp文件想要调用一个.c文件的函数时,我们需要用extern关键字就可以实现:
extern“c”
{
int sum(int a,int b);
}
那么就会有人说是不是在extern关键字后加“.cpp”就可以c语言文件调用.cpp文件了,并非如此;
因为extern关键字是c++中的c语言就识别不了这个关键字,那么该怎么做呢?
这时候我们就需要创建一个中间文件了,创建一个.cpp的中间文件,看代码:在mid.cpp中:
int sum(int a,int b);
extern"c"
{
int mysum(int a,int b)
{
sum(a,b);
}
}
这样就完成了.c文件调用.cpp文件函数的功能了。