C++与C的不同(一)

一、综述

前面,我们已经讨论了为什么要学习C++,及面向对象和面向过程思维的区别,今天我们讨论一下C和C++的区别。C与C++的最大区别在于它们的用于解决问题的思想方法不一样, C++比C更加符合软件工程学。

C是C++的子集,C实现了C++中过程化控制及其它相关功能,而在C++中的C相对于原来的C还有所加强,引入了重载、内联函数、异常处理等。C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等。 在C++中,除了考虑数据封装、类型这些,还需要考虑的是诸如:对象粒度的选择、对象接口的设计和继承、组合与继承的使用等问题。所以相对于C,C++包含了更丰富的“设计”的概念,但C是C++的一个自洽子集,也具有强大的功能,同样值得学习。

当然了,具体到语法方面,C++也自与C有许多不同,我们从以下几个方面来简单讨论:C++语言的输入和输出、注解、动态存储分配和释放存储空间、内联函数、const说明符、函数原形、缺省参数、引用、枚举名,结构名和联合名(都是类型名)、C++语言的类型、类型转换、函数体内定义变量的位置。

二、C++和C语法方面的差异

2.1 C++语言的输入和输出

(1)使用C语言的外部函数(如 printf, scanf等),要包含头文件"stdio.h"

(2)C++语言还提供自己的输入输出方式。是通过">>"和"<<"实现。C++编程包含输入输出头文件"iostream.h"

     cout<<"Hello,World";

    对于输入符号">>",如果需要连续输入多个数据,那么可以有以下两种方法:

    1)  每行只输入一个数据,以换行符结束一个数据的输入。

    2)一行输入多个数据,以空格符作为一个数据的输入结束标记;以换行符结束一行数据的输入。

例:

     int num;

     char pstr[20];

     cin>>num>>pstr;

  如果输入:

      120  cheng du

 则num为120,而pstr仅指向字符串cheng,而不是cheng du。

2.2 注解

     C使用"/*"开始,直到"*/结束,可以注解但不许镶嵌,C++以"//"开始,到行末结束,只能注解单行可以镶嵌。

镶嵌的意思是指:在同类型的东西中,再定义相同类型的东西,如/* */中再定义/* */。

当然了,在C++中,允许C语言的机制,可以用/**/。

2.3  动态存储分配和释放存储空间

在c语言是利用malloc和free函数完成的。函数原形为:

         void*malloc(size_t  size); //malloc.h

         void*calloc(int n ,size_t  size); //malloc.h

         void  free(void  *p);

比如要分配100个整型数的存储空间,将起始地址赋给指针变量p

 int *p;

 p= (int *) malloc(100*sizeof(int));

free(p);

在C++中,用new和delete。new自动计算要分配类型的大小,而不给出要分配的存储区的大小;它自动返回正确的指针类型,不必对返回指针进行强制类型转换;可以用new将分配的存储空间进行初始化。

运算符new用于内存分配的使用形式为

           type   *p;

           p=new type;

    其中,type是一个数据类名;p是指向该数据类型的指针;new从称为堆的一块空闲内存区中为程序分配一块内存,其大小与type类型的数据一样,该地址被存于指针p中。如果分配失败,new返回一个空指针。

    运算符delete释放new分配的存储空间,将其交还给堆。它的使用形式一般为

        delete  p:

    其中 p是一个指针,保存着new分配的内存的首地址。

    type可以是任何类型,包括函数指针,但不允许函数类型。当type为数组类型时,new返回的指针指向数组的第一个元素,当用new创建多维数时,必须提供所有维的大小。

1)p=new  int(99); //99为初始值,初始值可为常量,已经有值的变量,表达式

p=new  type[s];//s为整数。指定数组中的元素个数,可以是常量或表达式,                        
                //不能省略

delete [] p;

2)type  (*p)[常量1][常量2]…[常量n-1];

p=new  type[s][常量1][常量2]…常量[n-1];//s 指定数组中的第一维元素,可以是整数的常量.变量或表达式,不能省略…

delete []p;

2.4 内联函数

在函数原型前冠以"inline"表示一个内联函数。例如:

         inline  void  function(int  a,int  b);

    编译时,在调用function的地方用函数体替换,能够加快代码执行,减少调用开销。

    使用C++语言,可以上宏定义改写为内联函数:

      inline  long  abs(long num)

        {

             return     (num<0? –num:num);

         }

 1)内联函数内不允许有循环语句和开关语句。如果内联函数内有这些语句,按普通函数处理。

 2)联函数的函数体一般不宜过长,以1-5行为宜。

2.5 const说明符

1、说明符号常量:C语言用符号来代表常量的方法是使用无参的宏定义量:

    #define      PI    3.14

    其中,PI并不是真正的符号常量,它仅仅是一个字符串,没有类型,不占用存储空间,不能取它的地址,只是在预处理时,将它替换为3.14。

C++语言提供一个更灵活的方式来描述常数:

    const  type  const_name = type  类型的常数;

    如:const  float  PI=3.14;

    这时,PI是真正的符号常量,有类型,需要占用存储空间能取它的地址,但不能被无const约束的指针指向,它的值不能被修改。

int   *pint; 

const  int  MAX=100;

int  min;

pint=&min;   //正确

pint=&MAX;    //错误

2. 说明函数的形参

如函数  void   fun(const  int  num);

在该函数内,num被认为是常数,只能使用,而不能修改。

3. 说明指针变量

const可以与指针一起使用,分为三种情况: 

 1)指向常量的指针。将指针声明前加上const,使指向的对象为常量,而不是指针为常量。可以不初始化。

 int  a=1;

 const  int * pi;             

 pi=&a;

 *pi=10;   //错:不能修改指向数据

2)常指针。要把指针本身而不是它指向的对象声明为常量,采用运算符*const,必须初始化。通过它可以修改指向的数据;指针本身为常量,一旦初始化后,就不能让它指向其它的数据。实际上,该类指针只能指向变量,而不能指向真正的常量。例如:

 int  a=1,b=2;

 const  int  c=3;

 int * const  pi=&a;

 *pi=10;

 pi=&b;   //错误:不能修改指针本身,即不能让它指向其它数据

 int * const  pint=&b;

 *pint=20;    

 pint=&a;     //错误:

 int * const  pint_c=&c;    //错误   不能指向常量

3)指向常量的常指针。要使两个目标都是常量,二者都要声明为const,该指针称为指向常量的常指针,必须初始化。该类指针可以指向常量,也可以指向变量;但通过该指针不能修改它所指向的数据;初始化后也不能让它指向其它的数据。

  int  a=1,b=2;

  const  int  c=3;

  const  int * const  pi=&a;

  *pi=10;  //错误

   pi=&b;   //错误:不能修改指针本身

  const  int * const  pint=&c;

来自网上搜索整理,谢谢原作者

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值