Mr.J--.c 和.cpp 后缀详解

本文对比了C与C++中带默认值的函数、内联函数、函数重载及const关键字的不同用法,详细解释了C++如何通过增强特性提高编程效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载至新浪微博(只爱一颗星kkk的博客 )

   点击链接

虽然C与CPP的语法差不多,但是有些地方还是存在一些区别,现在一起来总结一下都有什么区别。

一。带默认值的函数

在C中,我们的函数是这个样子的:

 C Code 

1
2
3
4

 

int Sum(int a, int b)
{
    return a + b;
}

但是在C++中,我们的参数可以带默认值:

 C++ Code 

1
2
3
4

 

int Sum(int a, int b)
{
    return a + b;
}

1.默认值是从右往左给出的

 C++ Code 

1
2
3
4

 

int Sum(int a, int b,int c);//在这个声明中我们只能从右往左给出默认 
int Sum(int a, int b, int c = 10); //ok
int Sum(int a, int b = 10, int c); //error
int Sum(int a = 10, int b, int c = 10); //error

2。调用参数带默认值的的函数,效率可以提高

  调用函数,我们作重要的一步就是压实参。我们拿一段代码来举个例子

 C++ Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

 

#include
using namespace std;

int Sum(int a, int b = 20)
{
    return a + b;
}

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

    return 0;
}

在这段代码中,我们来看Sum(a,b),在调用这个Sum函数时,我们有如下的步骤:

压实参b:

(1)mov eax dword ptr[ebp-8]  取b值放在寄存器

(2)push eax  

压实参a:

(1)mov eax dword ptr[ebp-4]

(2)push eax

我们知道,我们取到b的值是要先放在寄存器中的,但是如果这个b给出了默认值,就可以直接把数值放入。

效率提高,也节省了mov的周期。

3.默认值无所谓在那里给,声明定义都可以

4.出现两个声明都给默认值的情况

(1)默认值只能给一次 

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

 int sum(int a,int b=10);错误,因为默认值只能给一次

(2)两个参数都给默认值

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

int sum(int a=10,int b);正确,因为代码是从下向上编译的,默认值又是从右往左给出的,所以正确。

 

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

int sum(int a,int b=20);//错误额,违反了从右往左的原则。

二。关于内联函数inline(之后会专门研究此函数)

1.重要知识点和考点

(1)inline int sum(int a ,int b)在一个函数名前加上inline,这个函数只在本函数中可见,                                  (2)它在用时不会产生栈的开辟和回退。  

(3)它只在release版本中不会产生栈的开辟和回退,在debug版本中还是会产生。    

(4)对于一些调用函数的开销 > 函数执行的开销的时,就用inline,但是要是调用还没有执行的开销大,就不需要使用。

(5)inline 写在头文件中,不写在源文件中。                                 

2.inline与宏

  相同处:它们在函数中做一个展开替换的工作。

  不同处:inline在编译期间处理,宏在预编译期间处理;inline还会做一个安全检查的工作,但是宏不做。

3.inline与普通函数

  相同处:inline也是函数的一种

  不同处:inline函数没有标准的栈帧的开辟和回退,但是普通函数不仅有出栈入栈的过程,也会产生符号。

4.inline与static函数

  相同处:都是其他文件不可见

  不同处:inline函数没有标准的栈帧的开辟和回退,static函数有正常函数栈帧的开辟和回退,而且static函数产生的符号都是local的,在链接中只处理global,不处理local的。

三。关于函数重载(之后具体单独总结)

1.重载的定义

 C++ Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

 


bool compare (int a, int b)//compare_int_int
{
    cout << "compare(int ,int)" << endl;
    return a > b;
}

bool compare (double a, double b) //compare_double_double
{
    cout << "compare(double ,double)" << endl;
    return a > b;
}

bool compare (float a, float b)//compare_float_float
{
    cout << "compare(float ,float)" << endl;
    return a > b;
}

bool compare(char *a, char *b) //compare_char_char
{
    cout << "compare(char* ,char*)" << endl;
    return strcmp(a, b) > 0 ? true : false;
}

我们来看这段代码,我们可以看出,这是在C++下运行的,因为在c中我们不可能将名字相同的函数写在一个文件中,因为在C中这样会导致函数重定义,但是在C++中却可以。因为在C中,函数的产生的符号是取决于函数名称,在C++中,函数产生符号取决于函数名称+形参类型+形参个数。所以上面的几个函数,在C++中可以运行,我们把这样的函数名相同但是形参列表不同的函数叫做函数重载。

2.静多态与动多态的区别

在C++中,我们区分静多态与动多态

(1)静多态:重载,模板

(2)动多态:继承,虚函数

3.重载时的一些问题

(1)我们不能仅通过返回值不同来进行重载,或者说,与返回值无关,举个栗子

 C++ Code 

1
2

 

void fun(int a,float b);
void fun(float a,int b);

这个也构成了函数重载,因为第一个产生的符号是fun_int_float,第二个是fun_float_int。

(2)重载时,编译器优先看实参的类型,举个栗子

 C++ Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

 

bool compare (int a, int b)
{
    cout << "compare(int ,int)" << endl;
    return a > b;
}

bool compare (double a, double b)
{
    cout << "compare(double ,double)" << endl;
    return a > b;
}

bool compare (float a, float b)
{
    cout << "compare(float ,float)" << endl;
    return a > b;
}

bool compare(char *a, char *b)
{
    cout << "compare(char* ,char*)" << endl;
    return strcmp(a, b) > 0 ? true : false;
}

int main()
{
     int a=2;

     int b=4;

     compare (a, b);
    return 0;
}

这样,编译器首先看实参类型为int,所以就选择bool compare (int a, int b)这个函数了。

(3)函数重载时,这些函数必须处于同一作用域中。并且优先考虑局部变量。

(4)函数重载,只用看函数名称,形参列表,形参个数,形参顺序,不用考虑返回值。

四。关于const

1.在C中的const

之前的博客总结了const在C中的用法,但是这里为了比较,就说最主要的区别。

在C中,加了const修饰的仍然是一个变量,只是唯一不可以做左值,我们称作常变量。与普通变量的空间开辟没有任何区别。

2.在C++中的const

(1)在C++中,const必须赋初值

(2)const int a=10;那么,我们的a就是一个常量。在后面的代码中遇到a,就会自动替换为10。

(3)const int a=10;   static  int a  =10;这两个都为其他文件不可见。

(4)我们在const前加extern ,举个栗子,extern const  int  a=10;这样,符号就会变成global。就可以变为常变量。

(5)const 与引用还有很多用法,之后单独总结。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值