C++(基础)———— c和c++的区别(一)

一、函数参数的默认值

C语言:

众所周知c语言的函数参数是没有默认值的。

c++:

1、 参数默认值的赋值:

    1、必须从右向左,依次赋默认值
    2、不可对函数参数重复赋默认值
       代码示例如下:
#include<iostream>
using namespace std;

//int fun(int a, int b = 30,int c);//error,参数3缺少默认值
int fun(int a, int b ,int c = 30);//ok

int main()
{
    fun(10,20);//函数的入参顺序是从右向左。

    return 0;
}

//int fun(int a, int b ,int c = 30)//error,已在函数声明中,给了参数3默认值
int fun(int a, int b ,int c)
{
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    cout << "c:" << c << endl;
    return 0;
}

2、 参数默认值的作用域:同文件

    只在同文件起作用(调用函数的文件中的默认值有效,实现函数的文件中的默认值无效)
    因为函数的展开(即传参)是在编译期进行的,所以此时并不能访问到别的文件中的数据。

二、 c语言的宏函数和c++的内联函

1、宏函数和内联函数的作用(相同):减少函数调用的开销。

2、宏函数:

    特点:不存在栈帧的开辟
	     不存在参数的带入
	     不存在返回值带出
	     不存在参数的清除
	     不存在类型检查
	     不可以调试 

3、内联函数:

    形式:在函数定义中把限定符inline放在函数的返回类型前面。
inline int sum2(int a, int b)//内联函数
{
	return a + b;
}
    特点:1、release版本:
    	不可调试
    	不会产生符号 		
    	不会进行栈帧开辟等动作 		
    	在调用点进行展开
	2、debug版本:
	可以调试 		
	会产生一个local的符号 		
	也会进行函数栈帧开辟之类的动作 		
	在调用点进行展开

4、比较:
在这里插入图片描述5、内联函数一定会展开吗?

答案是否定的。inline是对编译器的一个建议,编译器在适当的时候在该函数被调用的每个地方生成函数体代码的副本,以避免函数调用。
例:如递归类型的函数就不能展开处理。
因为函数展开是在编译期,此时并不知道函数参数的值,所以无法获取递归函数需要展开的次数,因此不能展开。

三、c++函数的重载

  1. 我们都知道C语言是不支持函数重载

    因为c语言中,函数符号的生成仅依赖于函数名,所以不能出现同名的函数。
    
  2. c++:
    1、函数符号 = 函数名 + 参数列表
    2、函数重载的条件:

    1、函数名相同
    2、参数列表不同
    3、属于同一作用域  
    

    3、代码展示:

bool compare(int a, int b)//生成的函数符号:compare_int_int
{
    cout << typeid(a).name() << "  " << typeid(b).name() << endl;
    return a == b;
}
bool compare(float a, float b)//生成的函数符号:compare_float_float
{
    cout << typeid(a).name() << "  " << typeid(b).name() << endl;
    return a == b;
}

bool compare(char a, char b)
{
cout << typeid(a).name() << "  " << typeid(b).name() << endl;
return a == b;
}

bool compare(short a, short b)
{
    cout << typeid(a).name() << "  " << typeid(b).name() << endl;
    return a == b;
}

bool compare(char *a, char*b)
{
    cout << typeid(a).name() << "  " << typeid(b).name() << endl;
    return !strcmp(a, b);
}

int main()
{
    compare('a', 'b');//char
    compare(10, 20);//int

    return 0;
}

4、 重载函数的调用类型要明确

例:子函数如上边代码所示,主函数中代码如下:
int main()
{
    compare(10.1, 20.2);
    
    return 0;
}
  此时就会出现错误,重载函数调用不明确。因为此处传的参数(10.1,20.2)是double类型,
  double类型可以转换成char*、char、float、int,所以此时主函数就不知道应该调用那个函数,
  这就是因为调用类型不明确引起的错误。

类型转换:
在这里插入图片描述
类型不一样的数据比较时,需要转换成同类型的

例:
    //1、
    unsigned int a = 1;
    char b = -1;
    cout << (a>b ? 'a' : 'b') << endl;//b

  // 2、
    unsigned short a1 = 1;
    char b1 = -1;
    cout << (a1>b1 ? "a1" : "b1") << endl;//a1
1、输出是b。变量a和b类型不同,应该先将它们转换成同类型,即将b抓换成unsigned int,
char类型的-1转换成unsigned int类型的值是255,255 > 1。
2、输出是a1,变量a1和b1类型不同,但是这两个类型属于同一级,将它们都转换成int,
unsigned short a1 = 1 --> int a1 = 1,  char b1 = -1 -->  int b1 = -1,  1>-1。

未完待续 ……

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值