700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 应届生春招/校招求职必备的C/C++面试题

应届生春招/校招求职必备的C/C++面试题

时间:2022-07-17 04:39:39

相关推荐

应届生春招/校招求职必备的C/C++面试题

常见面试题

C中static有什么作用

隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。

static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。C++中const有什么用

const修饰的内容不可改变,定义常量只是一种使用方式而已,还有const数据成员,const参数,const返回值,const成员函数等,被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。C/C++各自是如何定义常量的?有什么不同?

C使用宏#define定义,C++使用更好的const来定义。

区别:

const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查,而且字符替换时可能会产生意料不到的错误(边际效应)。

有些编译器可以对const常量进行调试,不能对宏调试。C++有更好的const为什么还要使用宏?

const无法代替宏作为卫哨来防止文件的重复包含。C++中引用和指针的区别

引用是对象的别名,操作引用就是操作这个对象,必须在创建的同时有效的初始化,(引用一个有效的对象,不可为NULL),初始化完成就再也不可改变,引用具有指针的效率,又具有变量使用的方便性和直观性,在语言层面上引用和对象的用法一样,在二进制层面上引用一一般都是通过指针来实现的,只是编译器帮我们完成了转换。之所以使用引用是为了用适当的工具做恰如其分的事,体现了最小特权原则。简述C/C++的内存分配方式

从静态存储区分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量,static变量。

在栈上创建。在执行函数时,函数内部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

从堆上分配(动态内存分配)程序在运行的时候用malloc或new申请任意多少的内存,程序员负责在何时用free或delete释放内存。动态内存的生存期自己决定,使用非常灵活。new/delete与malloc/free的区别

malloc()与free()是C语言的标准库函数,new/delete是C++的运算符,他们都可以用来申请和释放内存,malloc()和free()不在编译器控制权限之内,不能把构造函数和析构函数的任务强加给他们。在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”?

C++语言支持函数重载,C语言不支持。

函数被C++编译后在库中的名字与C语言不同。

假设某个函数的原型为:void foo(int x,int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

C++提供了C连接交换指定符号extern "C"来解决名字匹配问题。C++中什么是多态性?如何实现?

多态性是面向对象程序设计语言封装、继承之后的第三个基本特征。

它是在运行时出现的多态性通过派生类和虚函数实现。基类和派生类中使用同样的函数名,完成不同的操作具体实现相隔离的另一类接口,即把"w h a t"从"h o w"分离开来。

多态性提高了代码的组织性和可读性,虚函数则根据类型的不同来进行不同的隔离。什么是动态特性?

在绝大多数情况下,程序的功能是在编译的时候就确定下来的,我们称之为静态特性。反之,如果程序的功能是在运行时刻才能确定下来,则称之为动态特性。C++中,虚函数、抽象基类、动态绑定和多态构成了出色的动态特性。什么是封装?如何实现?

封装来源于信息隐藏的设计理念,是通过特性和行为的组合来创建新数据类型让接口与具体实现相隔离。C++中是通过类来实现的,为了尽量避免某个模块的行为干扰同一系统中的其他模块,应该让模块仅仅公开必须让外界知道的接口。什么是RTTI?

RTTI是指运行时类型识别(Run-time type identification)在只有一个指向基类的指针或引用时确定一个对象的准确类型。什么是拷贝构造函数?

它是单个参数的构造函数,其参数是与它同属一类的对象的(常)引用;类定义中,如果未提供自己的拷贝构造函数,C++提供了一个默认拷贝构造函数,该默认拷贝构造函数完成一个成员到一个成员的拷贝。什么是深浅拷贝?

浅拷贝是创建了一个对象用一个现成的对象初始化它的时候只是复制了成员(简单赋值)而没有拷贝分配给成员的资源(如给其指针变量成员分配了动态内存);深拷贝是当一个对象创建时,如果分配了资源,就需要定义自己的拷贝构造函数,使之不但拷贝成员也拷贝分配给它的资源。面向对象程序设计的优点?

开发时间短,效率高,可靠性高。面向对象编程的编码具有高可重用性,可以在应用程序中大量采用成熟的类库(如STL),从而缩短了开发时间,软件易于维护和升级。简述智能指针

智能指针的作用是管理一个指针,避免程序员申请的空间在函数结束时忘记释放,造成内存泄漏的情况发生。

使用智能指针可以很大程度上避免这个问题,因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。

所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。CPP智能指针有哪几种?

auto_ptr

unique_ptr

shared_ptr

weak_ptrC++中内存分配情况(替换6)

栈:由编译器管理分配和回收,存放局部变量和函数参数。

堆:由程序员管理,需手动new malloc delete free进行分配和回收,空间较大,但可能会出现内存泄漏和空闲碎片的情况。

全局/静态存储区:分为初始化和未初始化两个相邻区域,存储初始化和未初始化的全局变量和静态变量。

常量存储区:存储常量,一般不允许修改。

代码区:存放程序的二进制代码。C跟C++的关系

C跟C++的本质区别

1)C更倾向于面向过程,C++是面向过程+面向对象+泛型编程。

2)C解决问题的思路是如何通过一个过程来实现我们想要的功能,更注重的是算法;C++是先构造一个对象模型,然后通过调用成员函数来实现相应的功能。

3)C和C++动态管理内存的方法不一样,C是使用malloc/free,而C++除此之外还有new/delete关键字。

4)C++支持函数重载,C不支持函数重载。

5)C++中有引用,C中不存在引用的概念。

C跟C++的结构体区别

1)C的结构体不能定义函数,但C++的可以。

2)C的空结构体大小为0,C++的为1。

C++如何调用C库函数

1)在C库的.h文件中对于函数的声明前要加extern “C”,告诉g++不要对以下的函数名重命名。

2)如何区分此时用的是g++还是gcc?(1.g++中有_ _cplusplus这个宏,gcc没有;2.sizeof(‘字符常量’)g++结果是1,gcc是4)。面向对象技术的基本概念和基本特征是什么

1.基本概念:类、对象、继承;

2.基本特征:封装、继承、多态。

3.封装:将低层次的元素组合起来形成新的、更高实体的技术;

4.继承:广义的继承有三种实现方式:实现继承、可视继承、接口继承;

5.多态:多态性是允许将父对象设置成为一个或更多的他的子对象相等的技术,简单地说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。数组和指针的区别

1.数组要么在全局数据区被创建,要么在栈上被创建;指针可以随时指向任何类型的内存块;

2.修改内容上的差别:

char a[]="hello";a[0]='X';char *p="world"; //注意p 指向常量字符串p[0]='X'; //编译器不能发现该错误,运行时错误

3.用运算符sizeof可以计算出数组的容量(字节数)。sizeof§,p为指针得到的是一个指针变量的字节数,而不是p所指的内存容量。C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

公有继承、受保护继承、私有继承主要区别

1.共有继承时,派生类对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的公有和受保护成员;

2.私有继承时,基类的成员只能被派生类的成员访问,无法再往下继承;

3.受保护继承时,基类的成员也只能被派生类的成员访问,无法再往下继承。C++11最常用的新特性

1.auto关键字:编译器可以根据初始值自动推导出类型。但是不能用于函数传参以及数组类型的推导。

2.nullptr关键字:nullptr是一种特殊类型的字面值,它可以被转换成任意其他的指针类型;而NULL一般被宏定义为0,在遇到重载时可能会出现问题。

3.智能指针:C++11新增了std::shared_ptr、std::weak_ptr等类型的智能指针,用于解决内存管理的问题。

4.初始化列表:使用初始化列表来对类进行初始化。

5.右值引用:基于右值引用可以实现移动语义和完美转发,消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。

6.atomic原子操作用于多线程资源互斥操作。

7.新增STL容器array以及tuple

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。