返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >面试常见问题之C语言与C++的区别问题
  • 935
分享到

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

2024-04-02 19:04:59 935人浏览 泡泡鱼
摘要

目录C和c++的区别关键字static在C和C++区别1.定义局部静态变量2.限定访问区域答案结构体在C语言和C++的区别C中malloc和C++的new区别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 <stdio.h>
 
//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 <stdio.h>
#include <string.h>
 
//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 <iOStream.h>
#include <string.h>
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<<m.geta()<<endl;
	cout<<m.getb()<<endl;
	cout<<m.a<<endl;
 
	n.a=33;
	n.b=44;
 
	cout<<m.geta()<<endl;
	cout<<m.getb()<<endl;
	cout<<m.a<<endl;
	return 0;
 
}

运行结果

运行结果

答案

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

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

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

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


#include <iostream.h>
 
struct A
{
public:
	int a;
	int gata()
	{
    	return a;
	}
};
 
int  main(void)
{
 m.a=50;
 cout<<m.gata()<<endl;
 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<<"Before change:"<< a<<""<<b<<endl;
	swap(&a,&b);
	cout<<"After change:"<< a<<""<<b<<endl;
	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<<"Before change:"<< a<<""<<b<<endl;
	swap(a,b);
	cout<<"After change:"<< a<<""<<b<<endl;
	return 0;
}

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

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

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

指针可不初始化且初始化的时候,可以指向一个地址,也可以为空。引用必须初始化且只能初始化为另一个变量,如下:


int a=1024;
int *p=&a;
int &b=a;

引用之间的赋值和指针之间的赋值不同。指针赋值如下:


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本身。赋值之后,两个引用还是指向各自的原来对象,如图下图。

引用间赋值

引用间赋值

指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。如下所示:


int a=1;
int b=2;
int &v1=a;      //v1引用a
string *pi = &a; //pi指向a
v1=b;             //v1仍旧引用a,但是a现在的值是2;
pi=&b;             //pi指向b,a没有改变

答案

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

不存在指向空值的引用,但是存在指向空值的指针。

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

关于c语言与c++面试笔试题,最近文章《为各位学弟学妹整理的C语言/C++相关笔试面试题》,也整理了一份30多页的pdf

c语言与c++笔试面试PDF,点击获取

c语言与c++笔试面试PDF,点击获取

以上就是面试常见问题之C语言与C++的区别问题的详细内容,更多关于C语言与C++区别的资料请关注编程网其它相关文章!

--结束END--

本文标题: 面试常见问题之C语言与C++的区别问题

本文链接: https://lsjlt.com/news/126490.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 面试常见问题之C语言与C++的区别问题
    目录C和C++的区别关键字static在C和C++区别1.定义局部静态变量2.限定访问区域答案结构体在C语言和C++的区别C中malloc和C++的new区别C++引用和C的指针有何...
    99+
    2024-04-02
  • Java面试岗常见问题之ArrayList和LinkedList的区别
    目录1.ArrayList和LinkedList是什么?2.ArrayList和LinkedList性能比较          &n...
    99+
    2024-04-02
  • C语言常见的面试题有哪些
    这篇文章主要讲解了“C语言常见的面试题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言常见的面试题有哪些”吧!第1题:c语言有哪些核心的特征可移植性很强。模块化能力很强。灵活性很高...
    99+
    2023-06-04
  • Go语言在面试中的常见问题
    Go语言在近年来的发展中,成为了一个备受关注的编程语言。其简洁、高效、安全的特点,使得越来越多的公司和开发者开始关注和使用它。作为一个Go语言的开发者,我们需要掌握它的基本语法和常用库函数,同时也需要了解一些常见的面试问题,以便在面试中更...
    99+
    2023-06-13
    load 面试 shell
  • c++工程师面试常见问题有哪些
    小编给大家分享一下c++工程师面试常见问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  1、 c++是面向对象的编程语言吗C++中虚函数(virtual...
    99+
    2023-06-03
  • 常见的Java面试问题
    JVMJava虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。什么是字节码采用字节码的好处是什么在 Java 中,J...
    99+
    2023-06-03
  • java面试常见问题---ConcurrentHashMap
    1、请你描述一下ConcurrentHashMap存储数据结构是什么样子呢? ConcurrentHashMap 内部的 map 结构和 HashMap 是一致的,都是由:...
    99+
    2024-04-02
  • C语言常见的指针笔试题解析
    目录笔试题1笔试题2笔试题3笔试题4笔试题5笔试题6笔试题7笔试题8在我们学习指针之后,应该在实际应用中去理解和掌握它,毕竟实践才是检验真理的唯一标准,我们以后在找工作的过程中免不了...
    99+
    2022-11-13
    C语言指针笔试题解析 C语言指针笔试题 C语言指针
  • 单片机面试常见问题
    1、中断的概念?简述中断的过程 (1)中断:指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,转而执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序执行完毕...
    99+
    2023-09-04
    单片机 stm32 嵌入式硬件
  • c#常见的问题有哪些
    今天小编给大家分享一下c#常见的问题有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 ...
    99+
    2024-04-02
  • Java泛型常见面试题(面试必问)
    目录1、泛型的基础概念1.1 为什么需要泛型1.2 什么是泛型2、泛型的定义和使用2.1 泛型类\泛型接口2.2 泛型方法2.3 泛型类的继承2.4 类型通配符?及其上下限1...
    99+
    2024-04-02
  • 前端常见面试题之async/await和promise的区别
    目录asyncasync函数定义作用async 函数中 return 值如何接受方式一方式二awaitawait定义作用关于await的注意点[[promiseValue]][pro...
    99+
    2024-04-02
  • GO语言分布式面试中常见的问题有哪些?
    随着互联网的发展,分布式系统已经成为了现代软件开发中必不可少的一部分。而在分布式系统的开发中,GO语言作为一种高效、可靠、简洁的编程语言,也越来越受到开发者的青睐。在GO语言分布式面试中,常见的问题有哪些呢?下面我们来详细了解一下。 什...
    99+
    2023-06-29
    分布式 面试 教程
  • 了解Go语言中的面量常见问题
    在 go 语言中,面量是一种包含同类型值集合的常量。常见问题包括:面量赋值(必须在声明时赋值且不可修改)、切片面量(固定大小和类型)、结构体面量(字段不可修改)、字面量面量(需要时创建)...
    99+
    2024-04-03
    面试 go go语言
  • Java面试题中常见的问题有哪些
    本篇内容主要讲解“Java面试题中常见的问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java面试题中常见的问题有哪些”吧!  1、java 中会存在内存泄漏吗,请简单描述。  答:会...
    99+
    2023-06-02
  • R语言常见面试题整理
    尊敬的读者,这些R语言面试题是专门设计的,以便您应对在R语言相关面试中可能会被问到的问题。 根据我的经验,良好的面试官几乎不打算在你的面试中问任何特定的问题,通常都是以如下的问题为开...
    99+
    2024-04-02
  • Zookeeper面试常见的问题有哪些
    本篇内容介绍了“Zookeeper面试常见的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!NO1...
    99+
    2024-04-02
  • 常见的Node.js面试问题有哪些
    这篇文章主要介绍“常见的Node.js面试问题有哪些”,在日常操作中,相信很多人在常见的Node.js面试问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”常见的Nod...
    99+
    2024-04-02
  • Redis面试常见问题有哪些
    本篇内容主要讲解“Redis面试常见问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis面试常见问题有哪些”吧!1. 什么是缓存雪崩?怎么解决?通...
    99+
    2024-04-02
  • Python常见面试问题有哪些
    这篇文章主要介绍“Python常见面试问题有哪些”,在日常操作中,相信很多人在Python常见面试问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python常见面试问题有哪些”的疑惑有所帮助!接下来...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作