面试常见问题之C语言与C++的区别问题

在C中,用static修饰的变量或函数,主要用来说明这个变量或函数只能在本文件代码块中访问,而文件外部的代码无权访问,今天重点给大家介绍面试中常见的C语言与C++区别的问题,感兴趣的朋友跟随小编一起看看吧

C和C++的区别

  • C语言是一种结构化语言,其偏重于数据结构和算法,属于过程性语言
  • C++是面向对象的编程语言,其偏重于构造对象模型,并让这个模型能够契合与之对应的问题。其本质区别是解决问题的思想方法不同
  • 虽然在语法上C++完全兼容C语言,但是两者还是有很多不同之处。下面将详细讲解C和C++不同之处的常见考题

关键字static在C和C++区别

C和C++中都有关键字static关键字,那么static关键字在C和C++中的使用有什么区别?请简述之。

分析问题:在C中,用static修饰的变量或函数,主要用来说明这个变量或函数只能在本文件代码块中访问,而文件外部的代码无权访问。并且static修饰的变量存放在段存储区。主要有以下两种用途。

1. 定义局部静态变量

  • 局部静态变量存储在静态存储区,在程序运行期间都不会释放,只在声明时进行初始化,而且只能初始化一次,如果没有初始化,其自动初始化为0或空字符。具有局部变量的“记忆性”和生存周期“全局性”特点。
  • 局部变量的“记忆性”是指在两次函数调用时,第二次调用开始时,变量能够保持上一次调用结束数的值。如下例:
 #include  //20210520 公众号:C语言与CPP编程 void staticShow() { static int a=10; printf("a=%d\n",a); a += 10; } int  main() { for(int i=0;i<4;i++) { staticShow(); } return 0; }

运行结果

运行结果

利用生存周期的“全局性”,可以改善函数返回指针的问题,局部变量的问题在于当函数退出时其生存周期结束。而利用static修饰的局部变量却可以延长其生存期。如下所示:

 #include  #include  //202105205  公众号:C语言与CPP编程 char *p = NULL; char *helloToStr(char *b) { static char a[50]; a[0]='H'; a[1]='E'; a[2]='L'; a[3]='L'; a[4]='O'; strcpy(a+5,b); p=a; return a; }; int main(void) { printf("%s\n",helloToStr("yang")); strcpy(p+5,"song"); printf("%s\n",p); strcpy(p+5,"zhang"); printf("%s\n",p); strcpy(p+5,"wang"); printf("%s\n",p); return 0; }

运行结果

运行结果

2.限定访问区域

被static修饰的变量、函数只能被同一文件内的代码段访问。在此static不再表示存储方式,而是限定作用范围。如下所示:

 //Test1.cpp static int a; int b; extern void fun1() { ...... } static void fun1() { ...... } //Test2.cpp extern int a;        //错误,a是static类型,无法在Test2.cpp文件中使用 extern int b;       //使用Test1.cpp中定义的全局变量 extern void fun1();    //使用Test1.cpp中定义的函数 extern void fun2();    //错误,无法使用Test1.cpp文件中static函数

在C++中除了上述的两种常用方法外还有另外一种使用方法:定义静态成员变量和静态成员函数。静态成员变量或静态成员函数表示其不属于任何一个类实例,是类的所有类实例所共有的。如下所示:

 #include  #include  class A { public: static int a; static int geta(); int b; int getb(); }; int A::a=100; int A::geta() { return a; } int A::getb() { return b; } int  main(void) { A m,n; m.b=90; cout<

运行结果

运行结果

答案

在C中static用来修饰局部静态变量和外部静态变量、函数。而C++中除了上述功能外,还用来定义类的成员变量和函数,即静态成员和静态成员函数。

注意:编程时static的记忆性和全局性的特点可以使在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息。

结构体在C语言和C++的区别

分析问题:在C中,结构体是一种简单的复合型数据,由若干个基本类型数据或复合类型数据组合而成。而在C++结构体中,还可以声明函数。如下所示:

 #include  struct A { public: int a; int gata() { return a; } }; int  main(void) { m.a=50; cout<

输出结果:50

但是这种用法看起来有点不伦不类,这是C到C++过渡的遗留问题

答案

  • C语言的结构体是不能有函数成员的,而C++的类可以有。
  • C语言结构体中数据成员是没有private、public和protected访问限定的。而C++的类的成员有这些访问限定(在C++中结构体的成员也是有访问权限设定的,但是类成员的默认访问属性是private,而结构体的默认访问属性是public)。
  • C语言的结构体是没有继承关系的,而C++的类却有丰富的继承关系。

说明:虽然C的结构体和C++的类有很大的相似度,但是类是实现面向对象的基础。而结构体只可以简单地理解为类的前身。

C中malloc和C++的new区别

分析问题:malloc、free与new、delete都是用来动态申请内存和释放内存的。不同点如下:

  • malloc、free是标准库函数,new、delete则是运算符。malloc、free在C、C++中都可使用,而new、delete只属于C++。
  • malloc要指定申请内存的大小,其申请的只是一段内存空间。而new不必指定申请内存的大小,建立的是一个对象。
  • new、delete在申请非内部数据类型的对象时,对象在创建的同时会自动执行构造函数,在消亡时会自动执行析构函数,这不在编译器的控制之内,所以malloc、free无法实现。
  • new返回的是某种数据类型的指针,而malloc返回的是void型指针。
  • 由于new、delete是运算符,可以重载,不需要头文件的支持,而malloc、free是库函数,可以覆盖,并且要包含相应的头文件。

以上就是面试常见问题之C语言与C++的区别问题的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » C语言