C和C++的区别

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

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

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

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

1. 定义局部静态变量

  • 局部静态变量存储在静态存储区,在程序运行期间都不会释放,只在声明时进行初始化,而且只能初始化一次,如果没有初始化,其自动初始化为0或空字符。具有局部变量的“记忆性”和生存周期“全局性”特点。

  • 局部变量的“记忆性”是指在两次函数调用时,第二次调用开始时,变量能够保持上一次调用结束数的值。如下例:

#include //20200505 公众号: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 //20200505 公众号: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.cppstatic int a;int b;extern void fun1(){  ......}

static void fun1(){    ......}

//Test2.cppextern 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<    cout<    cout<  n.a=33;  n.b=44;  cout<    cout<    cout<    return 0;}

运行结果

答案

在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< return 0;}

输出结果: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是库函数,可以覆盖,并且要包含相应的头文件。

答案

  1. new、delete是操作符,可以重载,只能在C++中使用。
  2. malloc、free是函数,可以覆盖,C、C++中都可以使用。
  3. new可以调用对象的构造函数,对应的delete调用相应的析构函数。
  4. malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数。
  5. new、delete返回的是某种数据类型指针,malloc、free返回的是void指针。

注意:malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不能混用。因为两者实现的机理不同。

C++引用和C的指针有何区别

分析问题:引用就是变量或对象的别名,它不是值,不占据存储空间,其只有声明没有定义。在C++中引用主要用于函数的形参和函数返回值。

1、作为函数的参数

当函数的返回值多于一个时,可以使用指针实现。如下所示:

void swap(int *a, int *b){   int temp; temp = *a;    *a = *b;    *b = temp;}

int  main(void){  int a=10,b=5;   cout<    swap(&a,&b);  cout<    return 0;}

输出结果:

Before change: 10 55
After change: 55 10

虽然上述代码实现了多个返回值的功能,但是函数的语法相对传值方式比较麻烦。在函数中使用指针所指对象的数值时,必须在指针前加上*,如上例中的的swap函数频繁使用了“*a”、“*b”,如此不仅书写麻烦,还不利于阅读,并且容易产生错误。在函数调用时也容易产生误解,如上述代码main函数中swap(&a, &b),看起来好像是交换了两个变量的地址似的。而用引用实现swap函数,如下所示:

void swap(int &a, int &b){    int temp; temp = a;        a = b;   b = temp;}

int  main(void){   int a=10,b=5;   cout<    swap(a,b);    cout<    return 0;}

可以看出用引用实现swap函数比指针实现要简洁,调用也显得更加合乎情理。

2、引用作为函数的返回值

在大多数情况下可以被指针替代,但是遇到构造函数和操作符重载函数的“形式自然”的问题时,是不能被指针替代的。指针和引用功能相似,但是在操作时却有很多不同的地方,如指针的操作符是“*”和“->”,而引用常用的操作符是“.”。在使用时还要注意以下几点:

  1. 指针可不初始化且初始化的时候,可以指向一个地址,也可以为空。引用必须初始化且只能初始化为另一个变量,如下:
int a=1024;int *p=&a;int &b=a;
  1. 引用之间的赋值和指针之间的赋值不同。指针赋值如下:
int a=1,b=2;int *p1=&a, *p2=&b;

这时执行p1=p2;后,p1原来指向的对象v1的值并没有改变,而p1被赋值为p2所指向的对象,如下图:

指针间赋值

引用赋值如下:

int a=1,b=2;int &v1=a, &v2=b;

这时执行r1= r2;改变的是v1,将r 2指向的对象的值赋值给v1,而不是引用r1本身。赋值之后,两个引用还是指向各自的原来对象,如图下图。

引用间赋值
  1. 指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。如下所示:
int a=1;int b=2;int &v1=a;      //v1引用astring *pi = &a; //pi指向av1=b;             //v1仍旧引用a,但是a现在的值是2;pi=&b;             //pi指向b,a没有改变

答案

指针和引用主要有以下区别:

  • 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。
  • 引用初始化以后不能被改变,指针可以改变所指的对象。
  • 不存在指向空值的引用,但是存在指向空值的指针。

注意:引用作为函数参数时,会引发一定的问题,因为让引用作为参数,目的就是想改变这个引用所指向地址的内容,而函数调用时传入的是实参,看不出函数的参数是正常变量,还是引用,因此可能会引发错误。所以使用时一定要小心谨慎。

c++中的new_面试中常见的C语言与C++区别的问题相关推荐

  1. c语言字符串的一般操作有,面试必备——常见的C语言字符串操作

    原标题:面试必备--常见的C语言字符串操作 面试中常见的C语言字符串操作,快来看看,是否对你有帮助! 字符串倒序输出 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里 ...

  2. 中职计算机平面设计教师考试面试,中职教师面试常见问题

    中职教师面试常见问题 在中职教师面试中如何更好的突出自己呢?中职教师面试会问哪些问题?以下是小编为你整理的中职教师面试常见问题,希望能帮到你. 中职教师面试常见问题 1.学生记忆有什么特点?学科教学如 ...

  3. JavaScript 面试中常见算法问题详解

    JavaScript 面试中常见算法问题详解,翻译自 https://github.com/kennymkchan/interview-questions-in-javascript.下文提到的很多问 ...

  4. Java面试中,一些常见的有关多线程问题!

    面试作为入职的第一道门槛,其重要性不言而喻.对于从事IT的很多工作人员而言,对面试往往信心不足,毕竟在真实面试中,会遇到很多技术问题,万一哪块技术点不熟,就会与心仪的offer失之交臂.接下来,小千以 ...

  5. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  6. 数据结构 - 链表 - 面试中常见的链表算法题

    数据结构 - 链表 - 面试中常见的链表算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图. ...

  7. c++ 查找 list中最长的字符串_查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)...

    查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答) 给定一个字符串str,找到不重复字符的最长子字符串. 比如我们有 "ABDEFGABEF", 最长的字符串是 ...

  8. java面试技术问题_11个JAVA面试中常见技术问题

    原标题:11个JAVA面试中常见技术问题 大家在平常面试java的过程中都会遇到哪些难题呢?还有一些即将去面试java的童鞋们,你们想知道技术面试中会涉及到哪些点吗?达妹为你整理Java面试中会被问到 ...

  9. 面试中 项目遇见的难点答案_你和offer之间只差这几个面试问题!常见面试问题汇总...

    99%的人都会大呼"坑爹"的面试问题,你真的知道该怎么回答吗? 记得第一次面试的时候,面试官对简历也很满意,前面都聊的好好的,最后问了一句简历上没有的内容:你的职业规划是什么?我一 ...

最新文章

  1. 如何在Power 750上实现硬盘背板的分离
  2. 比较重量 网易2016实习研发工程师编程题
  3. rxjs里使用from operator从一个generator里生成Observable
  4. 清除string内容_python爬取哔哩哔哩网页弹幕内容,并将爬取的内容以五角星的形式显示出来...
  5. css餐厅_餐厅的评分预测
  6. 信息安全工程师考试大纲
  7. 云服务器如何实现装虚拟机_如何在服务器上安装虚拟机呢?服务器虚拟机安装教程...
  8. JQuery合并table单元格--有限制(table格式需要注意)
  9. HackerOne 公布十大漏洞奖励计划“豪门”
  10. 使用Xamarin在Visual Studio中开发Android应用
  11. db2判断字符为空_算法之字符串转换为数字
  12. vue组件基础知识及组件间通讯
  13. 基于HTML5 WebGL 与 GIS 的智慧机场大数据可视化分析
  14. 充分统计(sufficient statistic) 理解
  15. 怎样用计算机二元一次方程,键入公式在计算机如何键入二元一次方程式公式 – 手机爱问...
  16. 大学计算机应用基础教学设计,大学计算机应用基础电子教案设计.doc
  17. QT构建编译出现错误error: undefined reference to 的解决办法
  18. 【三种常见架构开发模式:MVC、MVP、MVVM】
  19. Linux 运维常见英文单词
  20. keil stm32标准库放在哪里_STM32(1)——使用Keil MDK以及标准外设库创建STM32工程...

热门文章

  1. java调用微信加密_用spring搭建微信公众号开发者模式下服务器处理用户消息的加密传输构架(java)...
  2. JDOM与DOM的相互转换
  3. 在Windows上创建CUDA C程序
  4. 【HDU5091】Beam Cannon,扫描线+线段树
  5. java编译生成哪些文件_java编译后生成什么文件?生成的文件包括什么?
  6. 2017.9.8 仙人掌图 失败总结
  7. MySQL中有exists关键字吗_Mysql中EXISTS关键字用法、总结
  8. java传感器编程_JSensorReader 无线传感器网络环境,直接从节点读取 采集数据的java程序 Script 249万源代码下载- www.pudn.com...
  9. mysql驱动加载原理_老调重弹:JDBC系列 之 lt;驱动载入原理全面解析gt;
  10. 商城网站该如何选择虚拟主机