C和C++的区别

区别:

  1.  c语言:  面向过程的语言,c++:面向对象的语言
  2. .二者动态管理内存的方法不一样:c语言:使用malloc/free函数,c++除此之外还有new/delete关键字(知识点1:new和malloc的区别)
  3. 关于重载:c语言不支持重载,但是c++支持函数重载。c++支持重载的原因在于c++的名字修饰和c不同,例如在c++中 int fun(int,int)函数的形式就是 _fun_int_int ,但是在C语言中是_fun,二者是不一样的,所以在C++中不同的参数可以调用不同的函数。(知识点2:函数重载
  4. C中的struct和c++中的类: C++中的类是C所没有的,但是C中的struct是可以正常在C++中运行使用的,并且C++对struct进行了进一步的扩展,使得struct在C++中可以和class一样当做类使用,而唯一和class不同的地方在于struct的成员默认访问修饰符是public,而class默认的访问修饰符是private。
  5. C++中有引用,C语言中没有(知识点3:引用和指针的区别
  6. c++中全部变量的默认链接属性是外链接,而C语言是内连接(知识点4:内外链接之分
  7. C中用const修饰的变量不可以用来定义数组的大小,但是C++中用const修饰的变量可以(如果不进行&解引用的操作的话,是存放在符号表的,不用开辟内存)

     

知识点扩充:

     知识点1: malloc/free 和 new/delete 的十点区别

  1. malloc是在堆上开辟空间,new是从自由存储区开辟:(自由存储区是c++抽象出来的概念,不仅是堆,也可是静态存储区)
  2. malloc/free是函数,返回的函数类型是:void* malloc(size_t size)/  void free(void * ptr),new/delete 是关键字;
  3. malloc需要对开辟的空间大小进行严格指定,但是new不用,只需要对象名;
  4. malloc开辟的空间可以给一个对象用也可以给数组用,释放的方式都是free();而new开辟对象数组用的都是new[size],释放的时候是delete[](内置类型可能不会引起问题,但是自定义类型的话,delete[]需要知道有多少个对象,而这个计数就放在这片空间的头部);
  5. 返回值问题:malloc开辟成功后返回的是 void*,需要强转,失败返回NULL;new成功后返回对象指针,失败抛出异常(这里可能会提到C++的new_handler机制)
  6. 是否使用构造和析构函数,new和free不但负责开辟空间,还会调用对象的析构函数和构造函数; new的三种表达方式(new运算符,operator new();placement new();)还有定位new表达式的使用;
  7. 是否可以相互调用,new的实现可以用malloc,malloc的实现不可以使用new;
  8. 是否可以被重载,我们可以重载自己的 operator new/ delete,但是不可以重载 new/delete/malloc/free;
  9. malloc开辟的内存如果太小,想要换一块大的,可以调用realloc实现,但是new没有直观的方法来改变。
  10. 当new中的底层实现如果获取不到更多的内容,会触发new_handler机制,留有一个set_new_handler句柄,看看用户是否甚至有这个句柄,如果设置了就去执行,句柄的目的是看看能不能从操作系统中释放点内存,找点内存,如果实在不行就抛出bad_alloc异常;而malloc就没有这种尝试了。

  知识点而二:函数重载

    什么是函数重载:在一个作用域里面,如果有多个函数的名字相同,但是参数列表不相同(形参的个数和类型不同),返回值类型可以相同,也可以不相同,我们将这样的函数称为函数重载。

    函数组成: 1.函数名   2.返回值     3.参数类型 :(1)个数 (2)类型(3)顺序

    函数重载三要素:(1)同名  (2)不同参   (3)同作用域

   注意点:    int sum(int a,int b){}

                  double sum(int a,int b){}  

                 主函数中   int main(){ sum(10,20)}  此时我们可以看到主函数调用sum函数,但是在此处我们只能看到函数名和形参类型,我们无法看到调用的函数什么返回类型,到底是int还是double,所以需要注意的是 函数名是无法给函数重载做支持的。

知识点三: const

     C中:常变量   编译阶段    检查有没有做左值,其他和常量一样

     C++中: 变量      编译阶段     把用到常量的地方都替换成常量初始化的值

                    一定要初始化

知识点四:引用

       引用是内存单元的别名。例如我们将猫可以又叫咪咪。咪咪就是猫的别名 。int a;  int *b=&a;   此时b 就是内存单元 a的另一个名字。

       1.为什么引用一定要初始化呢?  因为引用是内存单元的别名,只有当内存单元本身真实存在的时候,才能起别名啊。

       2.引用不能被引用,不能取地址的数据。例如: int  &b=a;

       3.引用只能引用 引用变量 所引用的数据

       4.引用不能被修改,例如我们不可以将猫叫咪咪的同时,又将狗叫做咪咪。(这个比喻有点可爱)

知识点五:引用和指针的区别

    1.指针有自己的一个空间,而引用只是一个别名;

    2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;

    3.指针可以初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用

    4. 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改就会改变引用所指向的对象。

    5.可以有const指针,但是没有const引用;

    6. 指针在使用中可以指向其他对象,但是引用只能是一个对象的引用,不能被改变;

    7.指针有多级指针(**p),而引用只有一级;

    8.指针和引用使用++运算符的意义不一样;

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值