C++校招常见面试题

1.struct和class的区别

(1)struct和class的默认权限不同:

struct的默认权限是public,而class的默认权限是private.

(2)struct和class继承的区别:

struct继承来的都是公有的,class继承来的都是私有的。

2.C和C++的区别:

C++面向对象、C面向过程。

3.C++的三大特征:

继承、封装、多态。

4.有没有代码经验?

(提前准备好一个程序)

5.做题

数据结构 DFS/BFS/排序/冒泡排序等经典排序

6.leetcode

7.指针*和引用&,你在做实际项目的时候,大多用哪个?优点是什么?

个人认为&好用,方便,而且不占用内存,而且不会因为忘记将指针置空(删除指针)而产生代码风险。

8.虚函数用的多不多?说一下虚函数的用法?

哪怕平常用的不多,也必须提前学习多用。

虚函数是实现多态的决定性条件。

注意事项:

(1)虚函数的声明处要加virtual

(2)只有派生类的虚函数遮蔽基类的虚函数才能构成多态。

(3)构造函数不能是虚函数。

(4)虚构函数可以声明为虚函数。

9.什么是宏?

10.C中static有什么作用?

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

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

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

11.C++中的const有什么用?

不要一听到const就说是常量,这样给考官一种在和一个外行交谈的感觉。应该说const修饰的内容不可改变就行了,定义常量只是一种使用方式而已,还有const数据成员,const参数,const返回值,const成员函数等,被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

12.C与C++各自是如何定义常量的?有什么不同?

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

区别:

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

(2)有些编译器可以对const常量进行调试,不能对宏调试。

13.既然C++中有更好的const为什么还要使用宏?

const无法代替宏作为卫哨来防止文件的重复包含。

14.C++中引用和指针的区别?

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

15.说一说C与C++的内存分配方式?

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

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

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

16.new/delete与malloc()/free()的区别?

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

17.#include<a.h>和#include"a.h"有什么区别?

对于#include <a.h>,编译器从标准库路径开始搜索a.h对于#include"a.h",编译器从用户的工作路径开始搜索a.h

18.在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"?

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

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

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

C++提供了C连接交换指定符号extern "C"来解决名字匹配问题。 

19.C++中的什么是多态性?是如何实现的?

多态性是面向对象程序设计语言继数据抽象和继承之后的第三个基本特征。

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

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

20.什么是动态特性?

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

21.什么是封装?C++中是如何实现的?

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

22.什么是RTTI?

RTTI是指运行时类型识别(Run-time type identification)在只有一个指向基类的指针或引用时确定一个对象的准确类型。

23.什么是拷贝构造函数?

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

24.什么是深浅拷贝?

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

25.面向对象程序设计的优点?

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

返京列车。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值