C++和C的联系与区别

摘要:C是一个结构化语言,它的重点在于算法和数据结构。对语言本身而言,C是C++的子集。

    C程序的设计首先考虑的是如何通过一个过程,对输入进行运算处理得到输出。

    对于C++,首先考虑的是如何构造一个对象模型,让这个模型能够配合对应的问题,这样就可以通过获取对象的状态信息得到输出或实现过程控制。

    因此,C与C++的最大区别在于他们解决问题的思想方法不一样。

    C实现了C++中过程化控制及其相关功能。而在C++中的C,相对于原来的C还有所加强,引入了重载、内联函数、异常处理等,C++拓展了面向对象设计的内容,如类、继承、虚函数、模版和包容器类等。

    在C++中,不仅需要考虑数据封装,还需要考虑对象粒度的选择、对象接口的设计和继承、组合与继承的使用等问题。

    相对于C,C++包含了更丰富的设计概念。

 

FAQ1.01   C++与C语言比较有哪些特点?

问题详述:C语言虽然是一门优秀的语言,但是在很多方面还是存在不足之处。C++是在C的基础上进行扩展的,提供了一些C语言不具备的功能。那么C++与C语言比较到底有哪些特点呢?

核心解答

由于C语言提供了灵活的数据类型和强大的硬件操作能力,因此被广泛应用于操作系统软件及硬件设备驱动的开发设计。但是在应用过程中,C语言也暴露出一些语言本身设计上的局限性,其局限性有以下几点:

(1)              C语言几乎没有提供任何支持代码重用的语言机制,导致使用C语言所开发的程序中包含了大量重复代码。

(2)              C语言的类型检测机制较弱,使得很多C程序中的错误不能在编译阶段被发现。

(3)              C语言的结构化特性使得其只适合开发中小型程序的开发设计,随着程序规模的不断扩大,开发人员很难控制程序的复杂性。

     C++正是为了解决C语言出现的问题而设计的,它继承了C语言的优点并弥补了C语言的不足。与C语言比较,C++的几个主要特点如下:

(1)       全面兼容C语言,许多C语言编写的代码不用修改即可直接在C++程序中应用。

(2)       支持面向对象,这是C++有别于C语言的最显著标志,也是C++最突出的特点。通过C++提供的面向对象机制,可以在程序中方便地构造出虚拟现实问题的属性和状态。

(3)       C++程序的可重用性、可扩展性以及可维护性都十分良好,能够简化大中型项目的开发流程并提高开发效率。

(4)       C++程序结构清晰,运行效率也比较高。

疑点点评:

虽然从命名上来看C++和C语言差别不大,但这两种语言在编程思想方面存在本质上的差别。对于那些拥有C语言基础的读者来说,学习C++时会轻松一些。如果没有任何语言基础也不要紧,只要掌握了正确的学习方法,同样能够学好并掌握C++。

良好的编程习惯

学习任何一门编程语言,都要掌握一定的技巧和方法,这样才能使学习做到事半功倍。正确的学习过程应该遵循以下步骤。

(1)       了解语言的基本特征及其用途。

(2)       准备一款基础的开发工具,最好是文本编辑器而不是集成开发工具,便于理解机制。

(3)       系统学习并掌握语言的设计基础知识。

(4)       严格按照规范进行开发设计。

(5)       真正掌握基础知识后,尝试一些语言的高级技术实现,并学习在各种平台及编程环境中使用该语言进行开发设计。

 

FAQ1.02    C++与C语言的代码注释风格有什么不同?

问题详述:虽然代码注释不会影响应用程序的运行结果,但实际上它已经成为了程序设计过程中不可或缺的一个重要组成部分。C++和C语言分别对代码注释的风格做出了不同的规定,那么二者之间有什么区别呢?

核心解答:在C语言中使用“/*……*/”的方式实现代码注释,书写在“/*”与“*/”之间的代码或者语句将不被编译器编译。C++除了保留C语言的这种注释风格外,还提供了一种更简便的注释方式,使用“//”实现单行注释。在C语言标准C99中,也可以使用“//”标识注释,它与C++的注释方法完全一致,但是很多C语言编译器并不支持这种注释方法。书写在“//”后面的部分将不被编译器编译。

疑点点评

在C++实际开发过程中,“/*……*/”主要用于多行代码注释,而“//”主要用于单行代码注释。在进行多行代码注释时,注释内容应该放在被注释代码的上方;在进行单行代码注释时,注释内容应该放在被注释代码的后面并且必须与被注释代码位于同一行内。

良好的编程习惯:

无论编写什么代码,都应该加入适当的代码注释。虽然对于程序运行来说代码注释并不是必须存在的,但是加入代码注释能够显著提高程序的可读性和可维护性。

 

FAQ1.03  C++与C语言的程序结构有何不同?

问题详述:

每一种编程语言都有其独特的程序结构体系,而掌握程序结构是学习一门新语言最基本的要求。因此在学习C++程序设计之前,首先必须了解C++的程序结构。那么C++与C语言的程序结构有何不同呢?

核心解答

由于C语言与C++分别基于不同的编程思想,因此这两种语言所编写的程序的基本构成也存在区别,主要有以下几点。

(1)C语言是面向过程的编程语言,其程序结构主要包括了预处理程序、自定义类型声明、常量定义、函数定义、以及主函数定义几大部分。一个典型的C程序代码结构如下:

#include<stdio.h>      /*声明头文件*/

#define PI 3.1415926   /*定义一个常量*/

 

int fun( )             /*定义一个函数*/

{

  ……              /*省略函数体内代码*/

}

 

int main( )           /*定义主函数*/

{

 fun( ) ;             /*在主函数中调用自定义函数*/

 ……              /*省略主函数内其他代码*/

}

  (2)C++ 是面向对象的编程语言,C程序中的预处理程序、自定义类型和常量定义等程序组成部分在C++中也是适用的,此外C++程序还包含了类的定义和适用两个主要程序组成部分。一个典型的C++程序代码结构如下:

#include<iostream>

Class Test           //类的声明部分

{

   private:        

int a;          //类中数据成员的声明

public:

fun( ){        // 类中成员函数的声明

     ……    //省略成员函数内部实现代码

}

}

 

int main( )        //定义主函数

{

   Test t;       //创建自定义类的对象(实例化)

   t.fun( );       //调用自定义类中的成员函数

   ……         //省略主函数中其他代码

}

疑难点评

C语言是一种面向过程的语言,而C++则是一种面向对象的编程语言,正由于这一区别导致两种编程语言的结构体系截然不同。在C++程序中代码始终围绕“类”来展开,这正是面向对象编程思想的体现。

良好的编程习惯

在进行C++程序开发设计时,应该以面向对象的思维方式看待和解决问题。另外在编写程序时要注意以下几点。

(1)       类的关键字“class”要小写,类名称首字母要大写。

(2)       代码要有适当的缩进。

(3)       实现不同功能的程序块之间应该加入一个空行。

 

FAQ1.04  C++与C语言是如何处理输入与输出的?

问题详述:由于程序在执行时最终要与外界进行交互的,因此必须提供相应的输入和输出功能,以解决程序与外界交互的问题。那么在C++和C语言中输入和输出功能是如何实现的呢?

核心解答:

C++与C语言分别提供了不同的输入与输出实现机制,具体如下:

(1)       在C语言中使用printf()函数实现格式化输出,使用scanf()函数实现格式化输入。

(2)       与C语言不同的是,C++采用了流的形式来控制输入和输出操作,这是一种更安全更便利的方法。其中cin是标准输入流,用于从标准输入设备(即键盘)读取数值并传递给指定的变量;cout 是标准的输出流,用于将指定变量的值写到标准输出设备中。

疑难点评:

C++全面支持C语言的输入与输出系统,但由于在C++中经常会涉及用户自定义类型的输入和输出操作,此时C语言的输入与输出系统就无法正常工作,因此就必须使用C++独有的输入和输出功能。

 

FAQ1.05  C++中局部变量的声明方式是否与C语言相同?

问题详述:

在程序设计过程中,变量用于记录及存取数据,任何变量在被使用之前必须先进行声明。根据变量作用范围不同,又可以分为局部变量和全局变量。那么在C程序和C++程序中,这两种变量的声明方式是否相同呢?

核心解答:

C语言对局部变量和全局变量的声明方式做出了严格的规定,如果不按照规范进行声明就会出现编译错误,而在C++中变量的声明则相对灵活很多。

在C语言中,全局变量必须声明在所有函数之前,局部变量必须声明在所执行语句之前。正确的C程序变量定义如下:

int a;

int b;

a=10;

b=24;

   而对于下面的代码,在程序编译时(C编译器)将会报错。

int a;

a=10;

int b;

b=24;

C语言规定了局部变量必须在所有可执行语句之前进行声明,而这段代码中对于变量b的声明之前存在可执行语句,因此C编译器会报错并终止编译。

在C++中,上面的代码在被编译时则不会出现任何错误。

疑难点评:

C++中的局部变量,在从其被声明的位置开始直至该变量所在程序段结束的整个范围内部是有效的。在实际开发过程中,可以根据需要在任何位置声明并使用局部变量。

良好的编程习惯:

由于C++中局部变量的声明较为灵活,因此可能会出现局部变量定义混乱的情况。建议在设计大型函数时,在需要的时候才去声明局部变量; 而在设计小型函数时,可以在使用之前统一声明所有局部变量。

 

FAQ1.06   在函数原型(函数声明)的使用方面,C++与C语言是否一致?

问题详述:

虽然C++是C语言的超集,但是它们之间还是存在细小的差别,C语言中的许多特性,当前C++标准还不支持。那么在函数原型使用方面,C++与C语言是否一致呢?

核心解答:

在C++中,函数声明就是函数原型。函数原型是一条程序语句,即它必须以分号结束。函数原型的3大要素是函数返回类型、函数名和参数表,其一般形式如下:

返回类型   函数名(参数表);

参数表包含所有参数的数据类型,不必包含参数的名称,参数之间用逗号隔开。

函数原型和函数定义在返回类型、函数名和参数表上必须完全一致,如果不一致就会发生编译错误。

下面的函数原型声明是合法的:

int fun(int , int);

等价于:  int fun(int length, int width);

例如,下面的代码中,函数声明与函数定义的函数原型不一致:

void fun(int ,float);

int main()

{

  int a;

float b;

fun(a,b);

}

void fun(int ,int)

{  ……//省略}

上述代码能够正确通过编译,因为函数声明的原型与函数调用相吻合。但是在连接时,发现没有与函数声明相一致的函数定义,结果产生“extra parameter in function call”(即不能确定的外部函数)的连接错误。

上述代码在C语言的编译环境下和在C++中都会发生相同的错误。C++与C语言在函数原型的使用方面并不完全一致,它们之间存在细小差别。

疑难点评:

标准库函数的函数原型(函数声明)都在头文件中提供,程序可以用#include指令包含这些原型文件。对于用户自定义函数,程序员必须在源代码中说明函数原型。

对于标准库函数(库函数)来说,编译器从来不把其实际代码看成是程序的组成部分。编译器能否正确的调用库函数是非常重要的。在头文件中内含的函数声明都是函数原型,如果函数原型不正确,编译器会及时报告错误。

 

FAQ1.07 在常量的定义方面,C++与C语言有何不同?

问题详述:

在程序的设计过程中,通常会使用常量来定义一些固定的数值,并在程序中使用常量名称来引用对应的数值。那么在常量的定义方面,C++与C语言有何不同?

核心解答:

在C语言中使用#define指令来定义常量,例如将圆周率定义为一个常量的实现代码为:

# define PI 3.1415926

虽然使用#define指令能够实现常量定义,但是这种定义方式存在一定的不安全性。因为其知识简单的内容替换。例如:

#include<stdio.h>

int main()

{

  int a=1;

  #define X a+a

  #define Y X*X

  cout<<”Y is”<<Y<<endl;

  return 0;

}

该程序将会执行 a+a*a+a 而与预定结果不同。

对于上面的代码,如果使用C++提供的方式定义常量不会出现这种错误。C++使用const修饰符来定义常量,这种定义方式比#define指令的定义方式更加安全及灵活。使用const修饰符代替#define指令对前面的例子进行改写,代码如下:

#include<iostream>

int main( )

{

  int a=1;

const X = a+a ;

const Y= X*X;

cout<<”Y  is”<<Y<<endl;

return 0;

}

当再次编译并运行程序时,将会得到期待的结果“Y is 4”。

疑难点评:

使用const修饰符定义常量需要注意以下几点。

(1)       不允许在程序的任何位置改变const修饰符声明的常量。

(2)       如果使用const修饰符定义一个整型常量,则数据类型关键字“int”可以省略。

(3)       const 修饰符定义的常量拥有数据类型,这一点会给编译时的类型检查带来便利。即即使默认为int型最好也带上,利于编译时类型检查。

 

FAQ1.08 C语言允许函数重载么? C++对于函数重载做出了哪些规定?

问题详述:

实现相同功能的函数可能会被应用于不同的环境之中,这时就要用到函数重载。那么C语言允许使用函数重载么?C++对于函数重载又做出了哪些规定呢?

核心解答:

事实上在C语言中不存在函数重载的概念,因为C语言不允许同一个程序中出现名称相同的函数。如果使用C语言实现数据相加的功能,对于不同的数据类型就需要给出不同的函数。例如:想要实现两个整型数据相加,两个浮点型数据相加,就需要分别定义以下两个函数:

intAdd(int m, int n);               //该函数实现了2个整型变量m和n的加法操作

floatAdd(float m, float n);          //该函数实现了2个浮点型变量m和n的加法操作;

如果程序中还需要执行其他数据类型的加法操作,则需要为每一个操作都定义号相应的函数。很显然这么做是非常麻烦的,其实各个函数之间唯一的区别仅在于传入的参数不同。那么有什么办法可以简化这一过程呢?答案就是使用C++的函数重载机制。

C++允许开发人员重载函数,即对于函数参数类型不同、参数个数不同或者参数类型和个数都不相同的情况,可以分别定义多个名称相同的函数。当这些函数被调用时,编译器会根据参数类型自动选择并调用合适的函数。

对于上面实现两个数据相加的例子,在C++程序中可以定义为以下形式:

add(int m, int n);    //该函数实现2个整型变量m和n的加法操作

add(float m, float n);  //该函数实现2个浮点型变量m和n的加法操作

在实际调用时编译器根据传入的参数决定调用哪个函数,例如:“add(3,4);”将调用“add(int m, int n)”函数进行处理,而“add(1.33, 2.73);”将调用“add(float m, float n);”函数进行处理。

疑点点评:

在使用C++函数重载时,需要注意避免使用不明确的重载。不明确的重载包括以下两个情况。

(1)               当同一个程序中两个或两个以上的函数拥有相同的函数名称、参数类型以及参数个数,区别仅在于函数返回值不同时,将会出现错误。因为调用此名称的函数还没有涉及函数返回值类型,所以编译器无法确定调用哪个函数。

(2)               在调用函数时,如果传入的参数与函数指定的参数类型不匹配,程序会自动将传入参数进行类型转换。但是在类型转换的时候可能会出现错误。例如两个重载函数所需参数类型分别为整型和长整型,当传入的参数为浮点型时,程序就无法确定应该将传入参数转换为何种类型。

 

FAQ1.09 处理动态存储分配问题时C++与C语言有何不同?

问题详述:

从堆或者自由存储空间分配内存被称为动态内存分配,程序在运行时需要动态分配内存空间存储临时数据信息。那么C++和C语言是如何处理动态存储分配问题的呢?二者的处理方法有何不同?

核心解答:

C++与C语言在处理动态存储分配问题时的区别如下:

(1)       在C语言中使用malloc()函数分配动态内存空间,使用free()函数释放动态内存空间。而在C++中则是使用new运算符分配动态内存空间,使用delete运算符释放动态内存空间。

(2)       在C语言中使用动态存储分配的函数,需要包括“malloc.h”或“stdlib.h”头文件,而在C++中使用动态存储分配的函数,不需要包含“malloc.h”或“stdlib.h”头文件;

(3)       在C语言中malloc( )函数分配的空间无法得知存放的数据类型,返回的是void型指针,因此还应该将其返回类型强制转换。而C++提供了更灵活的new运算符,new运算符可以自动确定对象的长度,该对象指向具体的数据。

例如:在C++的编译环境下动态分配内存,具体代码如下:

  #include<iostream.h>

  #include<string.h>

  void main( )

  {

     char *st;

     st = new char[12];

     strcpy(st, “C:\\download\\book.txt”);

     cout<<st<<endl;

}

上述程序中,如果用C语言编写“str=new char[12]”语句则应该是“str=(char*)malloc(12*sizeof(char));”。在C语言中,malloc( )函数返回的是(void *),因此需要强制类型转换。而在C++中返回的是new运算符后面定义的类型,即“char *”, 因此不需要转换。

疑难点评:

在C++中,new运算符可以自动计算所要分配的内存大小,并能够自动返回正确的指针类型。如果没有足够的内存空间来分配,new运算符将返回空指针,使程序更安全。new运算符用于内存分配的一般格式如下:

指针变量 = new类型名

new 运算符的作用是:在程序运行过程中从堆的自由存储区中为程序分配一块sizeof(类型名)大小的内存空间,并将该内存空间的首地址存储到指针变量中。

良好的编程习惯:

C++是在C语言的基础上进行的扩展,因此C++可以同时包含malloc()函数创建和用free()函数删除的存储空间及用new运算符生成和用delete运算符删除的对象。

建议在C++中最好使用new和delete运算符,因为使用new和delete运算符解决了malloc()函数无法调用构造函数的问题。

原文链接: https://www.cnblogs.com/Sarah-Dora/archive/2012/11/08/2761006.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++和C的联系与区别

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/68572

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午1:24
下一篇 2023年2月9日 下午1:24

相关推荐