c++和c的区别

1.函数参数的默认值

c++参数默认值的赋值

必须从右向左,依次赋默认值
函数参数的默认值不可以重复赋值
当main函数编译生成指令之后,其他文件中修改某一参数不会造成影响,只有在同一文件中重复赋值才会出错

下面是具体的示例代码:

#include<iostream>
using namespace std;

//int  fun(int a= 100, int b , int c); //error赋值必须是从右向左,c和b还没有被赋值
int  fun(int a, int b, int c = 40);

int main()
{
    fun(10,20);//入参的顺序也是从右向左,所以c = 40,b = 20,a = 10

    return 0;
}

//int  fun(int a, int b, int c = 10) //error 在上面函数申明的时候已经给c赋过值了,不能重复赋值 
int  fun(int a, int b, int c)
{
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    cout << "c:" << c << endl;

    return 0;
}

2.内联函数

内联函数的形式:在普通函数前面加上inline
内联函数会在调用点展开

代码示例:
inline int fun(int a, int b)//内联函数
{
	return a - b;
}
内联函数在不同版中的特点:
在debug版本中:在这个版中可以调试,会生成一个local符号,也会进行函数栈帧开辟回退之类的动作
在release版本中:不可以调试,不会产生符号,也不会进行函数栈帧回退之类的动作,但会在调用点进行展开

内联函数一定会展开吗?inline函数知识对编译器一个建议,编译器会在具体的情况下考虑是否处理成内联

3.宏:最大的隐患是没有安全检查

具体的代码如下:

#define SUM(a,b){a+b}
//宏定义是在预编译时期处理的,而其他函数传参是在编译时期

int main()
{
	int a = 10;
	int b = 20;

        c = SUM(a,b);//c = a+b;
	return 0;
}

 

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

宏、static函数和内联函数的区别:

        inline                  static                  宏 

debug版本中会生成local符号       产生符号               不产生符号
release版本中不会生成符号       

debug版本中会进行栈帧操作        进行栈指针操作         在调用点展开
release版中直接在调用点展开                            (预编译期)
        (编译期)

        可以调试                 可以调试               可以调试
    
        有类型检查              有类型检查              无类型检查

4.重载

C语言中

在c语言中靠的是函数名来生成符号,若是函数名一样,在编译时期生成的符号是一样的

C++中

在C++中,符号的生成是靠函数名和函数的参数列表生成的,这就是函数的重载
函数的重载需要注意一下几个方面:函数名要相同
                             函数参数要不同
                             必须处于同一作用域
                             

重载函数的示例:

bool compare_int(int a, int b)
{
	return a > b;
}
bool compare_float(float a, float b)
{
	return a > b;
}
bool compare_double(double a, double b)
{
        return a > b;
}
bool compare_char(char a, char b)
{
	return a > b;
}
bool compare_charPtr(char *a, char*b)
{
	return strcmp(a, b);
}

上面代码中每一个函数重载之后得到的类型不同,但是有时候会出现给的参数的类型不明确,则函数重载会失败,请看下面代码:

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(10.1, 10.2);

        return 0;
}

此时程序就会出错,主函数中给出的参数值是double类型,而double类型可以转换成float,char,int,char*,此时主函数就不知道调用那个函数了,所以一定要明确类型。

今天就先介绍这些吧,后续还有c和c++的区别......

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值