Mr.J--.c 和.cpp 后缀详解
转载至新浪微博(只爱一颗星kkk的博客 )
点击链接
虽然C与CPP的语法差不多,但是有些地方还是存在一些区别,现在一起来总结一下都有什么区别。
一。带默认值的函数
在C中,我们的函数是这个样子的:
C Code
1 |
int Sum(int a, int b) |
但是在C++中,我们的参数可以带默认值:
C++ Code
1 |
int Sum(int a, int b) |
1.默认值是从右往左给出的
C++ Code
1 |
int Sum(int a, int b,int c);//在这个声明中我们只能从右往左给出默认 |
2。调用参数带默认值的的函数,效率可以提高
调用函数,我们作重要的一步就是压实参。我们拿一段代码来举个例子
C++ Code
1 |
#include int Sum(int a, int b = 20) int main() 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 |
bool compare (int a, int b)//compare_int_int bool compare (double a, double b) //compare_double_double bool compare (float a, float b)//compare_float_float bool compare(char *a, char *b) //compare_char_char |
我们来看这段代码,我们可以看出,这是在C++下运行的,因为在c中我们不可能将名字相同的函数写在一个文件中,因为在C中这样会导致函数重定义,但是在C++中却可以。因为在C中,函数的产生的符号是取决于函数名称,在C++中,函数产生符号取决于函数名称+形参类型+形参个数。所以上面的几个函数,在C++中可以运行,我们把这样的函数名相同但是形参列表不同的函数叫做函数重载。
2.静多态与动多态的区别
在C++中,我们区分静多态与动多态
(1)静多态:重载,模板
(2)动多态:继承,虚函数
3.重载时的一些问题
(1)我们不能仅通过返回值不同来进行重载,或者说,与返回值无关,举个栗子
C++ Code
1 |
void fun(int a,float b); |
这个也构成了函数重载,因为第一个产生的符号是fun_int_float,第二个是fun_float_int。
(2)重载时,编译器优先看实参的类型,举个栗子
C++ Code
1 |
bool compare (int a, int b) bool compare (double a, double b) bool compare (float a, float b) bool compare(char *a, char *b) int main() int b=4; compare (a, b); |
这样,编译器首先看实参类型为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 后缀详解相关推荐
- Python 获取文件后缀详解
文章目录 1 概述 2 语法 3 扩展 3.1 os 模块详解 1 概述 #mermaid-svg-p01C6BlZHxzyBcdz .label{font-family:'trebuchet ms' ...
- C++中的 .h 和 .cpp 区别详解
2019独角兽企业重金招聘Python工程师标准>>> 在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析.于是,在C++中就要分出了头(.h)文件和实现( ...
- node项目打包如何隐藏html后缀,详解webpack打包nodejs项目(前端代码)
随着前端体积越来越大,功能越来越丰富,这时候就需要将前端工程化,而webpack就是用于将前端各种文件打包起来.一个简单的webpack应该包含以下几个概念 入口起点 配置 组件 加载器 模块 模块热 ...
- 2020牛客多校 J Easy Integration 计算过程详解【点火公式(Wallis积分)+组合数学】
2020牛客暑期多校训练营(第一场) J Easy Integration 题 网上题解大多是 不断分部积分求解,其实有更为简洁的解法. 便是 Wallis积分(点火公式) + 组合数学 求解,本文给 ...
- 显卡型号后缀详解(转)
显卡型号中最复杂的部分,应该是型号后的英文字母.因为它代表着显卡虽然采用同一个图形核心,但市场的定位不同.最麻烦的是ATI与NVIDIA公司各自使用的后缀字母不统一(也不可能统一),让人看得眼花缭乱. ...
- Java中文处理, 资源包后缀详解
作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2002/07 最后更新: 02/22/2006 14:42:55 版权声明:可以 ...
- C、CPP const 详解
1.const修饰变量 一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value ...
- Mr.J-- jQuery学习笔记(三)--静态方法详解
jQuery静态方法 什么是静态方法? 静态方法对应的是对象方法,对象方法用实例对象调用,而静态方法用类名调用. // 1.定义一个类function AClass() {}// 2.给这个类添加一个 ...
- pytorch scatter和scatter_详解
文章目录 0. Introduction 1. 定义 2. 详解 例1 例2 Reference: 0. Introduction scatter() 和 scatter_() 的作用是一样的,只不过 ...
最新文章
- Cocos事件监听(JS)
- 接口与抽象类的使用选择
- Briefings in Bioinformatics:微生物基因组学和功能基因组学相关软件和数据库的研究进展
- elasticsearch:7.9.3 docker 开启日志
- J-Link 输出供电问题
- 角谱传播法matlab模拟,角谱法分析高斯光
- 三级菜单 ajax 已经测试成功
- 组态软件运行在云服务器_能在云服务器上运行软件吗
- 全自动光电整纬机安装和功能分析
- Unity WIndows语音识别(一)关键字识别
- spring源码 第二个后置处理器方法的使用-推断构造函数
- matlab之矩阵运算
- win10输入法看不见选字框_Win10更新后微软拼音输入法没有选字框怎么办?
- excel表格打印每页都有表头_如何在Excel打印时每页都有表头?你知道么
- 30_Python基础_异常
- 和平之翼代码生成器 SHCEU 版 4.0.0 Beta2 版 千年隼公布
- 数加生产制造执行系统(MES)——优势
- python手机销售系统_京东手机销售数据分析kaggle复盘python+tableau分析
- ImageJ如何测量物体的面积大小
- C#开发Android App--01--准备工具
热门文章
- Python for 循环语句-Python 基础教程
- python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...
- 【TensorFlow】TensorFlow函数精讲之tf.get_variable()和tf.get_variable_scope()
- 什么是嵌入式视觉、行业应用、目前挑战
- 慧材技术中核普达测量与测绘系统介绍(一)
- 数据结构(九)计数排序
- php mysql 单例模式_PHP基于单例模式实现的mysql类
- java mongodb 返回所有field_Python爬虫框架:scrapy爬取知乎关注用户存入mongodb
- python创建新进程_Python os.fork()方法:创建新进程
- Linux get cpu number,Linux上获取CPU Core个数的实现