又要记上课笔记了……
今天是总结C语言和C++的不同之处,请各位同学找好位置坐下来好好听课呢!
1.面向思想不同
首先C语言的特性是POP 面向过程编程 (Procedure Oriented Programming)
其次是C++的OOP面向对象编程 (Object Oriented Programming)
种地例子
咱们这里就通俗的讲解何为面向过程和面向对象:
假设你是个农民,要种地,你就得想怎么种地,种什么,什么时候收获,这些问题你都得想出解决方案,面向过程就是说明解决这些方案的特性:你可以通过面向过程设计个解决怎么种地的问题,种什么东西的问题……注意,这里是说一对一的解决问题,也就是说只编一个函数对应一个问题,比如说你要种西瓜,改程序中的函数,你还要再种个芒果,再改……久而久之你可以想到程序有多少行代码才能适应所有情况
而面对对象就不一样了,它不关心你种什么东西,也不想管你到底咋种,它关心的是农具、农民这些对象物体
你可以将一个农民和一把农具当成对象,农民伯伯是个对象,他有丰富的种地经验,所以我们不用管他怎么种,这是他的事,他爱咋种就咋种,我们只需要告诉他种什么,他就能给我们立刻种出来我们要的东西……
通过这上面两个例子我们可以看出来:面向过程需要考虑很多元素,而面向对象只需要考虑选什么对象
这两个情况可以看成面向过程是通过函数实现一个功能,而面向对象是通过对象实现一个功能,并且这个功能的性能还是有很大的差距。
2.基本函数和函数对象的差别
关于标准I/O的差别
首先我们得知道printf和scanf与cin和cout的差别
1.printf和scanf是C语言的I/O
2.cin和cout是C++的I/O
printf和scanf是函数,cin和cout是对象(嘿嘿嘿,结合上面的农民伯伯例子就可以知道对象是什么啦)
printf有很多格式要求,比如说
scanf("%d",&a);
printf("%d",a);
但cin和cout就不一样啦
cin>>a;
cout<<a;
是不是简便多了?其实啊,这都是对象的原因,要不是cin/cout可以智能分辨出a的数据类型,并且按正确的格式输入和输出!(cin和cout很聪明,学过C语言的都知道格式控制符有多么累,有时候出错点可能还是格式控制符和数据类型不一致)
3.基本运算符的差别
目前运算符如果按照参数数目可以分为单目运算符、双目运算符与三目运算符。但那样分类的话会漏很多运算符,还会缺少C++的灵魂——::作用域运算符(目前用不上了解这个,以后会学到的,现在只需要知道这个运算符是C++对于C语言特有的)
所以可以这样分类
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
如果是C++玩家,最好了解所有的运算符,因为C++要用到很多运算符,比C语言相比C++的运算符还是很多的,而且C++11的标准C也加了不少可选的运算符
以下只需了解就行,平时可能用不了
- C++有::作用域运算符,而C语言平时没有
- C++中,抛出异常采用的是try catch throw,而C语言使用的则是setjmp与longjmp
4.动态分配内存的差别
其实在C++11中就允许直接申请一个变量然后直接用在数组的下标上了,但在那之前是都不允许的,所以学习动态分配内存是有必要学的,因为如果直接通过声明一个变量然后当作数组下标是很危险的行为,我们不知道这个数组内存的所在位置(如果听不懂这段的意思,可以想象下内存划分三个部分:栈,堆,自由分配内存,其中操作系统是要占据一部分内存的,如果你调用了其中的内存单元并且刚好是操作系统中的重要单元,轻则重启,重则崩溃……)
int a,b[a];//就像这样的命名,在VC6++这个老编译器是行不通的,Dev c++是可以运行的
malloc()和free()是C语言常用的动态分配内存,通常他们是函数,调用格式为
int *p=(int*)malloc(int);//这只是举例子,不一定要用int,申请int大小的内存
free p;//释放内存
而C++就不一样了,他们是new()和delete()
int *p=new int;
delete p;
注意,这两个有本质上的区别,malloc()和free()是函数,new和delete是运算符!
5.代码上的风格的差别
命名空间域&命名空间
using namespace std;
这个语句在C++中很常见,其实这里是命名空间语句,如果要搞清楚他的话,得明白作用域:
C 语言中作用域只有两个:局部,全局,往细里面再划分的话就是块作用域和文件作用域还有函数作用域与函数原型作用域。C++中则是有:局部作用域,类作用域,名字空间作用域三种。
#include<iostream>
using namespace std;
const int a;//我是全局变量,我在全局域,我不和下面的变量发生冲突。
/*在各种函数的外头,也就是不在任何的函数里面,是全局域,在全局定义的变量叫全局变量*/
int main
{
/*在任何函数的里头,是局部域,比如说我定义了下面的a变量,是在main函数里面,也就是说他是局部变量*/
int a;//我是局部变量,我在局部域,我不和上面的全局变量冲突哦。
cout<<"helloworld"<<endl;
}
目前咱们只需要知道局部和全局是怎么回事就行了,命名空间域和类作用域解释起来过于生涩,在这里只说明,C++比C语言多了类作用域和名字空间作用域。
那么什么是命名空间,你可以想象下你划分出好几个空间,那么在不同空间之内,有不同的程序员,他们各敲出相同的变量,那么那些变量会冲突吗?不会,因为是在不同的空间内,肯定不会发生变量重合什么的事情……
强制类型转换
关于这个强制类型转换可能就有朋友听不懂了,这里是说在一个数据类型情况下转换另一个数据类型,但为啥有强制这个两个字:
原因是因为在强制类型转换之前还有个按数据类型优先性隐性转换,这个是看不见的,它要按照数据类型的排名来决定是否转换,那么要是遇到不能转换的,你却需要转换的情况下怎么办,你可以选择强行转换
double a;
(int) a;//C语言的强制转换
int (a);//C++的强制转换
注意C++是能兼用C语言的强制类型转换格式,也就是说我能用C++代码写C语言的强制类型转化格式。
指针类型转换
这里稍微说下C和C++的区别:
C 语言中 void *类型可以转化指向其他类型的指针类型,但 C++就做不到
这里是说C语言可以自动转化,但C++是不能直接赋值给其他指针,必须强制类型转化,但其他类型指针是可以自动给void *赋值
6.头文件的差别
注:自己写的头文件需要用“”引用,而标准的头文件要用<>引用
C语言的标准头文件是#include<XXXX.h>
现在C++的标准头文件基本都是不带.h,但其实C++是允许带.h的,但那已经是老式的写法了,而且没有经过标准化,里面存放的函数原型很多都是和现在的标准头文件差了太多了.
比如说#include<iostream.h>和#include<iostream>这两大区别就是有无经过标准化,而且如果C++使用带.h的头文件,则不需要添加使用命名空间的声明。
如果是自己写的头文件,那必须加上.h,比如#include"XXXX.h".C语言同理
7.编译器的差别
C语言主要用GCC编译器(现在也能编译C++)
C++主要用G++编译器
8.C++在C语言上扩展的部分
关键字上的不同
- C语言全局const会被存储到只读数据段。C++中全局const当声明extern或者对变量取地址时,编译器会分配存储地址,变量存储在只读数据段。两个都受到了只读数据段的保护,不可修改。
- C语言中局部const存储在堆栈区,只是不能通过变量直接修改const只读变量的值,但是可以跳过编译器的检查,通过指针间接修改const值。
- C语言的const不能用于命名数组的下标,C++可以用于命名数组的下标。
多态,继承,类,数据抽象和封装等等带有POP的特征
目前只需要知道这些是面向对象的基本特征就行,往后会深入了解这些三大基本特征:多态 继承 类
转载:https://blog.csdn.net/weixin_45677047/article/details/105013579