博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言和c++的区别及缺省参数的使用
阅读量:4185 次
发布时间:2019-05-26

本文共 2870 字,大约阅读时间需要 9 分钟。

我们都知道,C语言是面向过程的语言,c++是基于面向对象的语言,所以在学习c++之前,我们要先来理解面向过程和面向对象的区别,以下是网上查阅资料和大神讲解所罗列出来的简单总结:

面向过程:

就是思考到事物发展的每一步,细如发丝,考虑到任何一种可能发生的情况,一步步的执行,判断,直至事物的结束。即分析出解决问题所需要的步骤,然后用函数把这些步骤一个一个实现,使用的时候一个一个调用函数即可。这种编程方式的核心问题是数据结构和算法的开发和优化。

面向对象:

就是把事情分解成不同的对象,建立对象的目的不是为了某一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。 其主要思想是基于抽象数据类型的(Abstract Data Type, ADT):在结构化编程过程中,人们发现把某种数据结构和用于操纵它的各种操作以某种模块化方式绑定到一起会非常方便,使用这种方式进行编程时数据结构的接口是固定的。  即将某一类事物的共同属性进行抽象,将其所有的属性,行为按功能集合;

实例讲解:

例如设计一个象棋:面向过程的思路就是首先分析问题的步骤:

1.开始游戏;

2.黑子先走;
3.绘制棋盘画面;
4.判断输赢;
5.白子走;
6.绘制棋盘;
7.判断输赢;
8.返回到步骤2;
9.输出最后的结果;
就这样一步步的实现,问题就解决了;

而面向对象则是从另外一个思路来设计解决问题:

1.玩家系统:黑白ABCD都是玩家,所以属性,步骤功能一样;
2.绘制棋盘系统;
3.规则系统:决定哪个先走,判断输赢等操作;

可以看出面向对象是以功能来划分,而不是步骤,黑子落棋后通知白棋棋盘发生变化,绘制棋盘系统就开始把变化绘制出来,规则系统则判定结果;赢了则返回,否则由白字继续走;

如果要加一个悔棋功能,面向过程则需要改动很多地方,黑子撤回棋,棋盘变化,然后载绘制,再判断,可能很多要变化;随着功能的越来越多,系统无法应付功能需求的规则的复杂而膨胀,最终导致奔溃;但是面向对象只需要得到悔棋命令后,绘制棋盘系统将棋盘重新绘制,调用规则系统判定即可,减少了大的改动;保证了面向对象程序的可扩展性;

又例如:对人这类这种高级动物:

如果面向对象:你只需要吃饭,跑步,睡觉几个命令即可;

面向过程:做饭,拿筷子,夹菜,夹饭,嚼,咽、、、一步步的写相应的函数,一个一个调用实现功能;顺序的向下做;

但是:

对象是由一个个过程组合起来的;具有封装性;所以他需要很大的空间。


至此,我们了解了面向过程和面向对象的区别,现在我们来认识C语言和c++的区别。

(1)关键字:

c99标准下 ---有32个关键字c++98标准下 ---有63个关键字

关键字详情请看我的博客:

(2)源文件:

在C语言时,源文件后缀为‘ .c ’ ; 而c++源文件后缀为‘ .cpp ’;在创建源文件不加后缀时,默认为cpp。

(3)变量定义:

c语言中必须在代码最前面进行定义,再使用。c++则可以一边定义,一边使用。

(4)函数:

1>返回值:

C语言中,可以不指定函数返回值类型,若不指出,则默认返回int类型。  例:Funtest(){ }C++中,如果函数没有返回值,则必须给定为 void  例:void Funtest(){ }

2>参数列表:

C语言函数中若没有指定参数列表时,默认可以接收任意多个参数 。例:Funtest();   Funtest(10);   Funtest(10,20); C++函数体中若没有参数,则不能接收任何参数。

因此,c++支持带缺省值的语法—-函数的缺省参数:

缺省参数:在声明或者定义函数时为函数的参数指定一个默认值。在调用函数时,若没有指定实参则使用默认值,否则适用指定实参。

例:void Test(int  byteSize= 100){    return  malloc(byteSize);}int main (){Test(); //①Test(200);  //若有指定实参,则使用指定实参}

①:在调用函数时;若没有指定实参,则使用该默认值,且在函数调用前不是在函数体里面给定;而是以参数传过去

缺省参数分为两种:全缺省和半缺省。

全缺省参数:函数每一个参数都带有缺省值 。

例:void Funtest(int a=10 ,int b=20;int c=30){Printf(“a=%d\n”,a);Printf(“b=%d\n”,b);Printf(“c=%d\n”,c);}

半缺省参数:函数一部分参数带有缺省值 。

例:void Funtest(int a ,int b;int c=30)                 {                                                               Printf(“a=%d\n”,a);                             Printf(“b=%d\n”,b);Printf(“c=%d\n”,c);}

注意:

1:参数给缺省值只能从右往左给定

例:void Funtest(int a ,int b;int c=30)*可以void Funtest(int a =10,int b;int c)*不行void Funtest(int a =10,int b;int c=30)*不行

2:缺省参数不能同时在函数声明和定义中–缺省参数放在函数声明中比较好

3:缺省值必须是常量或者全局变量

4:C语言不支持缺省参数

此外:

①:在调用函数时,有实参使用实参,且从左边开始传实参

例:void Funtest(int a=10 ,int b=20;int c=30){Printf(“a=%d\n”,a);Printf(“b=%d\n”,b);Printf(“c=%d\n”,c);}Int main(){Funtest();//    10,20,30Funtest(1,2,3);//   1,2,3Funtest(1);//1,20,30Funtest(1,2);//1,2,30}

②半缺省中,函数调用时每个参数必须都给定值才能编译通过

例:void Funtest(int a ,int b;int c=30)                 {                                                               Printf(“a=%d\n”,a);                             Printf(“b=%d\n”,b);Printf(“c=%d\n”,c);}int main(){               结果: Funtest();//编译不通过Funtest(1,2,3);// 1,2,3Funtest(1);// 编译不通过Funtest(1,2);// 1,2,30}

转载地址:http://xvuoi.baihongyu.com/

你可能感兴趣的文章
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
在C++中如何实现模板函数的外部调用
查看>>
HTML5学习之——HTML 5 应用程序缓存
查看>>
HTML5学习之——HTML 5 服务器发送事件
查看>>
SVG学习之——HTML 页面中的 SVG
查看>>
mysql中用命令行复制表结构的方法
查看>>
hbase shell出现ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException
查看>>
解决Rhythmbox乱码
查看>>
豆瓣爱问共享资料插件发布啦
查看>>
kermit的安装和配置
查看>>
linux中cat命令使用详解
查看>>
java中的异常机制
查看>>
商务智能-基本方法-数据钻取
查看>>
C++程序员技术需求规划(发展方向)
查看>>
JNI
查看>>
tk.mybatis的使用记录
查看>>
遍历获取目录下的所有文件
查看>>
从指定服务器路径下载文件
查看>>
EasyExcel读取和写入java model数据
查看>>
《C编译原理》共享库的动态加载和静态加载
查看>>