c++ (1) c++ 与c 的区别

2021-02-20 19:25发布

可以说c++ 语言在c基础上扩展了许多  在学习玩c语言之后  学习c++ 会发现容易一些  但是c++也有优越于c 的地方 c++ 与c 语言都属于本地编译型语言 ,直接编译成本地编译码,运行特别快。

c++ OPP 面向对象语言  区别于 java python  PHP  脚本(解释性)语言  后者必须要具备脚本解释器,运行在本地操作系统上

因此c与c++ 的区别  总结以下

 

1) c++  支持带默认参数  

1    函数形参给默认值  ,从右向左给    void  fun (int a,int b=10) ✅   void  fun (int a=10,int b)❌

2    函数形参可以在声明的时候给  也可以在定义的时候给

3   调用一个带默认值的函数与一个不带默认值的函数在效率上具有区别

int sum(int a = 10, int b = 20);
int sum(int a, int b)
{
    return a + b;
}
int main()
{
    sum(10,10);
         00FE142E  push        0Ah
             00FE1430  push        0Ah
         00FE1432  call        sum(0FE105Fh)
         00FE1437  add         esp, 8

    sum();
         00FE143A  push        14h
         00FE143C  push        0Ah
         00FE143E  call        sum(0FE105Fh)
         00FE1443  add         esp, 8

    int a = 10;
    int b = 10;
    sum(a, b);
    00FE1446  mov         dword ptr[a], 0Ah
    00FE144D  mov         dword ptr[b], 0Ah
    00FE1454  mov         eax, dword ptr[b]
    00FE1457  push        eax
    00FE1458  mov         ecx, dword ptr[a]
    00FE145B  push        ecx
    00FE145C  call        sum(0FE105Fh)
    00FE1461  add         esp, 8

实质上sum(10,20);与sum();没有区别  给定参数或使用默认值都会进行压栈操作,调用CPU的PUSH指令

而 int a=10,b=20;  sum(a,b);  效率慢于上面 ,会先去内存中取a,b 的值增加了mov  指令

2)c++ 函数支持重载

    1 c 语言为什么不支持重载?  

因为c 语言编译器生成函数符号时,只按照函数名生成 因此定义多个函数 函数名不能相同

例如  void fun()        _fun

而c++编译器生成函数符号时,是根据函数名和函数参数一起生成的,所以一组函数名相同 参数列表不同的(参数个数,参数类型不同) 就可以构成重载函数

bool compare(int a, int b) 
bool compare(double a, double b)  
bool compare(const char* a, const char* b)

2 重载函数的调用在什么时候确定,编译阶段还是运行阶段 ???

重载函数在编译阶段确定  call  指令需要函数的逻辑地址

3 理解多态

静态(编译时期)的多态: 函数重载   ,模版

动态(运行时期)的多态: 虚函数

因此考虑的在c++ 下使用c 函数时 需将函数符号命名规则统一

首先在c++ 下调用c的接口  需将c的接口放到 extern "c" 下

在c中调用c++的接口 相当麻烦  要将符合c语言的代码 全部放到extern "c"{ } 中

在多文件工程中 ,c项目函数声明文件中 将所有声明扩到 #ifdef __cplusplus这个宏中,可以给其他c/c++项目使用

 

3)动态申请空间的区别 malloc /free      c++      new/delete 

 

1 malloc 是C的库函数  而new是运算符

2 malloc是按字节申请内存,使用的时候返回值要进行类型强转  而new申请内存是要指定类型,所以返回值不需要强转

3 malloc只负责申请内存 不能初始化:而new可以申请内存和初始化一起完成

4 malloc申请内存失败  返回nullptr指针  ;而new申请失败抛出异常,只能通过捕获

5 实际上new底层也是通过malloc来申请内存,但是优化与malloc

 

free 与 delete 的区别

malloc 开辟二维数组  与  new 开辟二维数组

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
using namespace std;

int main()
{
  int **p=(int **)malloc(sizeof(int*)*3);
  int i=0;
  for(;i<3;i++){
 p[i]=(int *)malloc(sizeof(int)*4);
  }
  int **s=new int*[3];
  for(i=0;i<3;i++){
  s[i]=new int[4]();
  }
  for(i=0;i<3;i++){

  free(p[i]);

  }
  free(p);
  for(i=0;i<3;i++){
    delete[]s[i];
  }
  delete []s;
    cout<<endl;
    return 0;
}

 

1 delete释放空间先调用析构函数  再释放;而free直接释放

2delete也是运算符  而free是库函数

标签: