转载至新浪微博(只爱一颗星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 与引用还有很多用法,之后单独总结。

Mr.J--.c 和.cpp 后缀详解相关推荐

  1. Python 获取文件后缀详解

    文章目录 1 概述 2 语法 3 扩展 3.1 os 模块详解 1 概述 #mermaid-svg-p01C6BlZHxzyBcdz .label{font-family:'trebuchet ms' ...

  2. C++中的 .h 和 .cpp 区别详解

    2019独角兽企业重金招聘Python工程师标准>>> 在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析.于是,在C++中就要分出了头(.h)文件和实现( ...

  3. node项目打包如何隐藏html后缀,详解webpack打包nodejs项目(前端代码)

    随着前端体积越来越大,功能越来越丰富,这时候就需要将前端工程化,而webpack就是用于将前端各种文件打包起来.一个简单的webpack应该包含以下几个概念 入口起点 配置 组件 加载器 模块 模块热 ...

  4. 2020牛客多校 J Easy Integration 计算过程详解【点火公式(Wallis积分)+组合数学】

    2020牛客暑期多校训练营(第一场) J Easy Integration 题 网上题解大多是 不断分部积分求解,其实有更为简洁的解法. 便是 Wallis积分(点火公式) + 组合数学 求解,本文给 ...

  5. 显卡型号后缀详解(转)

    显卡型号中最复杂的部分,应该是型号后的英文字母.因为它代表着显卡虽然采用同一个图形核心,但市场的定位不同.最麻烦的是ATI与NVIDIA公司各自使用的后缀字母不统一(也不可能统一),让人看得眼花缭乱. ...

  6. Java中文处理, 资源包后缀详解

    作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2002/07 最后更新: 02/22/2006 14:42:55 版权声明:可以 ...

  7. C、CPP const 详解

    1.const修饰变量 一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value ...

  8. Mr.J-- jQuery学习笔记(三)--静态方法详解

    jQuery静态方法 什么是静态方法? 静态方法对应的是对象方法,对象方法用实例对象调用,而静态方法用类名调用. // 1.定义一个类function AClass() {}// 2.给这个类添加一个 ...

  9. pytorch scatter和scatter_详解

    文章目录 0. Introduction 1. 定义 2. 详解 例1 例2 Reference: 0. Introduction scatter() 和 scatter_() 的作用是一样的,只不过 ...

最新文章

  1. Cocos事件监听(JS)
  2. 接口与抽象类的使用选择
  3. Briefings in Bioinformatics:微生物基因组学和功能基因组学相关软件和数据库的研究进展
  4. elasticsearch:7.9.3 docker 开启日志
  5. J-Link 输出供电问题
  6. 角谱传播法matlab模拟,角谱法分析高斯光
  7. 三级菜单 ajax 已经测试成功
  8. 组态软件运行在云服务器_能在云服务器上运行软件吗
  9. 全自动光电整纬机安装和功能分析
  10. Unity WIndows语音识别(一)关键字识别
  11. spring源码 第二个后置处理器方法的使用-推断构造函数
  12. matlab之矩阵运算
  13. win10输入法看不见选字框_Win10更新后微软拼音输入法没有选字框怎么办?
  14. excel表格打印每页都有表头_如何在Excel打印时每页都有表头?你知道么
  15. 30_Python基础_异常
  16. 和平之翼代码生成器 SHCEU 版 4.0.0 Beta2 版 千年隼公布
  17. 数加生产制造执行系统(MES)——优势
  18. python手机销售系统_京东手机销售数据分析kaggle复盘python+tableau分析
  19. ImageJ如何测量物体的面积大小
  20. C#开发Android App--01--准备工具

热门文章

  1. Python for 循环语句-Python 基础教程
  2. python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...
  3. 【TensorFlow】TensorFlow函数精讲之tf.get_variable()和tf.get_variable_scope()
  4. 什么是嵌入式视觉、行业应用、目前挑战
  5. 慧材技术中核普达测量与测绘系统介绍(一)
  6. 数据结构(九)计数排序
  7. php mysql 单例模式_PHP基于单例模式实现的mysql类
  8. java mongodb 返回所有field_Python爬虫框架:scrapy爬取知乎关注用户存入mongodb
  9. python创建新进程_Python os.fork()方法:创建新进程
  10. Linux get cpu number,Linux上获取CPU Core个数的实现