C 与 C++ 的真正区别在哪里?
C 与 C++ 的真正区别为以下几点:
1.不再有#define、#inelude等预处理器功能
C语言有一个重要的特色就是预处理器。有些其它语言虽然也加人了#icnlude的功能,但是还缺少处理宏的能力。使用预处理器虽然可以方便的实现许多功能,但是从软件工程的角度来看,对整个软件的维护其实是很不利的。由于C语言的预处理器功能较强,有经验的程序设计员常会开发出一套只有自己才看得懂的宏集语言,一旦整个软件要交付给其它人维护,别人则很难在短时间内了解前一个设计者编写的宏集功能,由此增加了软件开发时集体工作的难度和日后维护的困难。
另外,C语言编译器所看到的程序码,与程序设计者所看到的程序码是不同的。程序设计者看到的是尚未经过预处理器处理过的程序码,而编译器看到的则是经过预算过的程序码,一旦交给预处理器处理的宏集内容有误,编译器所产生的出错信息将无法使程序设计者判断。这一点也增加了程序除错的困难。
2.不再有stureutre、union和t即edef
事实上,在C++中就可以去掉C语言中的sturc-utre和,uinon等对复杂数据类型的自定义结构类型。因为类的定义方式可以完全做到这一点。而ty侧刻ef也是不必要的,一切都用类就可以了。虽然C++这样的设计是为了和C相容,但是除了使用了多余的语言规定外,也造成了对程序认识的混淆。
3.不再有oGot
在程序设计语言的发展历史中,G〔,t。一直被毁誉参半。在很多情况下,使用(3oot可以大幅度减少程序代码,但也由于oGot可以很自由地改变程序流程,如果不小心使用就会造成程序结构上的混乱。在C语言中,我们可以使用break和。onitnue来改变某一循环的流程,但是如果想要改变两层以上的循环的流程,不是使用oGot就是以多余的逻辑变量(1切laen),配合一个条件语句(if)判断来实现。
4.不再有OperatorvOerloading
在C++中,operato:voerloading同样也是一项值得探讨的设计。几乎在所有的C++书籍中都会引用一些例子,告诉读者使用operato:voerloadi吃可以使您的程序看起来更自然。如果您使用“+”来作为复数的加法符号,大家都不会疑义,但是如果使用“,”或其它符号,别人在阅读您的程序时就难免会产生疑义。这就是OPeratorvOerloading的问题所在,当大家都对运算符斌予自己的定义,整个程序的可读性就大大降低。operatorvoerloading的存在并没有必要,我们一样可以通过类中的方法来达到同样目的。
才疏学浅,希望我的回答能给你带来帮助,望采纳!
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。
简单来说,C++有面向对象的概念,而C语言没有。
C++与C的区别:
1、C是面向过程的语言,而C++是面向对象的语言,那么什么是面向对象?
面向对象:面向对象是一种对现实世界的理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。
2、C和C++动态管理内存的方法不一样,C是使用malloc、free函数,而C++不仅有malloc/free,还有new/delete关键字。那malloc/free和new/delete差别?
malloc/free和new/delete差别:
①、malloc/free是C和C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
②、由于malloc/free是库函数不是运算符,不在编译器范围之内,不能够把执行构造函数和析构函数的任务强加入malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,一个能完成清理与释放内存工作的运算符delete。
③、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。
④、malloc是从堆上开辟空间,而new是从自由存储区开辟(自由存储区是从C++抽象出来的概念,不仅可以是堆,还可以是静态存储区)。
⑤、malloc对开辟的空间大小有严格指定,而new只需要对象名。
⑥、malloc开辟的内存如果太小,想要换一块大一点的,可以调用relloc实现,但是new没有直观的方法来改变。
3、C++的类是C中没有的,C中的struct可以在C++中等同类来使用,struct和类的差别是,struct的成员默认访问修饰符是public,而类默认是private。
4、C++支持重载,而C不支持重载,C++支持重载在于C++名字的修饰符与C不同,例如在C++中函数 int f(int) 经过名字修饰之后变为_f_int,而C是_f,所以C++才会支持不同的参数调用不同的函数。
5、C++中有引用,而C没有。那指针和引用有什么差别?
指针和引用的区别:
①、指针有自己的一块空间,而引用只是一个别名。
②、使用sizeof查看一个指针大小为4(32位),而引用的大小是被引用对象的大小。
③、指针可以是NULL,而引用必须被初始化且必须是对一个以初始化对象的引用。
④、作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象。
⑤、指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被修改。
⑥、指针可以有多级指针(**p),而引用只有一级。
⑦、指针和引用使用++运算符的意义不一样。
6、C++全部变量的默认连接属性是外连接,而C是内连接。
7、C中用const修饰的变量不可以用在定义数组时的大小,但是C++用const修饰的变量可以。
8、C++有很多特有的输入输出流。
首先,C语言是中级语言,C++是高级语言
两者最大的区别是前者是面向过程式的计算机程序设计语言,而后者是面向对象式的计算机程序设计语言
什么叫面向对象,首先要了解两个东西对象和类;
对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。所以,对象是类的实例。
类 - 类可以定义为描述对象行为/状态的模板/蓝图。
而面向过程,就是由一系列要执行的计算步骤组成,通常采用自上而下、顺序执行的方式。
C、C++ 程序主要组成包括以下部分:
预处理器指令:#include<库函数>
函数:返回数类型 函数名(参数){函数体} int main(){}
变量:数据类型 = 值
语句 & 表达式:printf("Hello, World! \n");
注释:// "单行注释" /**/ "多行注释",将会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释。
只从两者的组成来看,C++程序和C不同的在于,会多几个数据类型,还有就是他们需要调用的库函数。
上面的这是C++和C在写程序时的格式的一点不同。
他们真正的不同在于,C++在于可以根据对象构造一系列该对象的特征建造一个类。
例如,如何把一直大象装进冰箱?
用C++写就可以简化为:
1、打开冰箱
2、把大象装进去
3、关上冰箱
如果用C写这段程序就需要考虑:什么样的大象?什么样的冰箱?怎么装大象?怎么关门?,主要考虑的是装大象的过程,而C++就只需要考虑大象和冰箱这两个对象就可以了
只要了解面向对象和面向过程的区别,就能知道C和C++的真正区别了
前 言:
很多人认为C++是C语言的升级版,但两者在本质上还是有非常大的区别的,该问题也是在employment过程中经常会涉及到的,下面对该知识点进行介绍,在面试中也可参考以下内容回答。
内容导读:
一、 C 和 C++ 的本质区别
二、C 和 C++ 的语法区别01 C 和 C++ 的本质区别
三、引用与指针
一、C 和 C++ 的本质区别
C语言是面向过程的语言,即结构化编程语言,它的重点在于算法和数据结构。在C语言程序设计过程中,首要考虑的是分析解决问题的步骤(步骤划分),然后通过一个过程将这些步骤一步一步实现,即对输入进行运算处理,得到相应的输出。面向过程语言性能较高,不需要实例化对象,消耗资源较少;但不易维护、不易复用、不易扩展。
C++语言是面向对象的语言,它的重点在于构造对象模型,构造对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题过程中的行为,即它是实物抽象化的一种体现(功能划分)。面向对象语言易维护、易复用、易扩展,可以设计出低耦合的系统。
二、 C 和 C++ 的语法区别
1、后 缀 名
C源文件后缀为.c,C++源文件后缀为.cpp。
2、声明头文件(输入输出流)
C:#include <stdio.h>
C++: #include <iostream>// C++头文件不再使用.h扩展名
3、变量声明
C:局部变量必须在所有"操作"语句之前声明;
C++:局部变量可以在程序块内的任何地方声明。
例如:C:int I; For (i=0; i<10; i++)
C++: for(int i=0; i<10; i++ )
4、输入输出方式
C:printf()/scanf()为C的库函数;
C++:cout/cin是ostream和istream类型的对象。
5、malloc、free&&new、delete
C语言中使用malloc、free来分配内存,C++中使用new、delete分配内存;
malloc、free是函数,需要C的头文件支持;new、delete是关键字,需要编译器的支持;
malloc、free调用时不会调用构造函数和析构函数,但new、delete会分被调用该函数;
new的底层会调用malloc,delete的底层会调用free;
6、struct/class
Struct适合看成是一个数据结构的实现体;class适合看成是一个对象的实现体;
struct默认的访问权限是public,而class默认的访问权限是private;
class可以用于声明类模板Templete <class C>√,而struct不可用于声明类模板Templete <stucrt C>×。
引用与指针
引用是C++对C语言的重要扩充。引用就是某一变量的一个别名,对引用的直接操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名,定义引用的表示方法与定义指针相似,只是用“&”代替了“*”。
指针是一个变量,它的值为另一个变量的地址;由于可以通过地址能找到所需的变量单元,即地址指向该变量单元。因此,将地址形象化的称为“指针”,意思是通过它能找到以它为地址的内存单元。
引用与指针有很大的区别,简要概括如下:
1、指针有自己的一块地址空间,而引用只是一个别名;
2、使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;
3、指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用;
4、作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象;
5、可以有const指针,但是没有const引用;
6、指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变;
函数重载
C语言中根据函数名称生成函数符号的,这也就注定了c语言不存在函数重载的概念;而C++生成函数符号则考虑了函数名、参数个数、参数类型。需要注意的是函数的返回值并不能作为函数重载的依据,也就是说int sum()和double sum()这两个函数是不能构成重载的,且函数必须处于相同作用域才可以构成重载。
函数重载也属于多态的一种,也就是所谓的静多态。
静多态:函数重载,函数模板
动多态(运行时的多态):继承中的多态(虚函数)。
关于函数重载的问题,最重要的是隐式类型转换问题。
调用重载函数的时候,编译器首先会判断提供的参数,如果提供的实参和调用重载函数的形参类型绝对匹配,则调用相应的重载的版本;如果不匹配,则会进行相应的默认转换。如果转换成功,则调用相应的函数重载的版本;但如果转换后的类型与现有的重载函数出现二义性,则会有相应报错。如下例,当doule进行类型转换时既可以转成int,也可以转成float,故编译时会出错。