[C++]面试可能涉及的问题

下列页码,一般来自
  1. C++ Primer
  2. Essential C++
PS:相关/相连的问题,不分开

C/C++常考面试题, 链接

C++的空类,编译器会自动添加那些函数?

解析const?53页

解析C++的static?

能不能在头文件中使用using?
  1. 不能,因为会造成包含该头文件的所有文件都定义了该using,造成命令空间混乱。

解释一下,对象的初始化与定义?40页

直接初始化与拷贝初始化?76页

解释拷贝、赋值与析构?440页

默认的拷贝构造函数是浅拷贝,解释一下:深拷贝和浅拷贝?

vector容器(内存机制、扩容实现)? [C++]vector

list实现原理? [C++]list

拷贝、复制与析构函数,分别是在什么情况下需要用户自行编写的?
C++Pirmer 三五法则

C++面向对象的三大元素是?
封装:
继承:
     让我们得以定义一整群互有关联的类,并共享共通的接口。
多态:
     让我们得以用一种与类型无关(type-independent)的方式来操作这些类对象

封装

继承

继承有多少种方式?
public:
private:
protected:
当然,从数量上来看,还有单继承、多继承

多态
C++如何实现?
通过虚函数实现

多态的作用?作is-a图说明
  1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用。
  2. 接口重用:为了类在继承和派生的时候保证使用家族中任一类的实例的某一属性时的正确调用。

解析一下C++的动态绑定?
  1. static member function和non-static member function都是静态绑定
  2. 而只有virtual member function才是运行时的动态绑定
被调用的函数解析被延迟到运行时才能决定,称为动态绑定。

虚函数
怎么实现?(个人认为,这还是需要讲到虚表上面来)
通过虚函数表实现
 
虚函数表
C++虚函数表解析, 链接
它放在哪里?
由编译器决定,一般放在类对象的实例的最前面(地址的头部),为了确保取到虚函数表有最高的性能。
虚函数的静态解析?这是虚函数机制不会出现预期行为的两种状态
  1. 基类的构造与析构
  2. 使用基类对象,而非基类的引用与指针

有了解C++ RTTI机制吗? 链接
RTTI是运行时的类型鉴定机制

智能指针,手写一个share_ptr?share_prt的实现?

共享指针、弱指针?
共享指针:share_ptr
弱指针:ware_ptr

C++的写时复制机制(构造一个String类的时候会遇到)
其实是深拷贝与浅拷贝的问题

C++看什么书?
  1. C++ Primer(参考手册,目前不断看,争取毕业前看完)
  2. Essential C++(上手课本)
  3. Effective C++(没开始看,所以不应该提及)

引用与指针区别?分别在什么情况下使用?
灵活性
  1. 引用一旦初始化,就无法指向另一个对象
  2. 指针无初始化一说,使用过程中可以随意更改指向
效能
  1. 指针是地址指向,引用是变量“别名”
  2. 两者都是效率非常高的
安全
  1. 指针为空,地址指向易错,地址溢出,不安全
  2. 引用绝不出错

内存对齐
要求:1.会算 2.讲述对齐的原因, 链接
  1. 平台移植
  2. 性能提速

C++内存分配方式? [Linux]C/C++内存分配方式
  1. 全局/静态区
  2. 常量区

allocator类

堆、栈,生命周期(生存期)、作用域?
堆栈:针对变量或实体的内存位置以及创建方式
  1. 从程序内存布局看,栈里面,临时存放数据
  2. 从创建方式看,栈由系统自由控制,堆由程序员控制申请
生命周期(生存期):
  1. 全局对象:程序启动时分配,在程序结束时销毁
  2. 局部自动对象:进入其定义所在程序块时被创建,离开块时销毁
  3. 局部static对象在第一次使用前分配,在程序结束时销毁
作用域:
  1. 作用域是程序的一部分,在其中名字有其特定的含义。C++语言中大多数作用域都以花括号分隔。
  2. 同一名字在不同的作用域中可能指向不同的实体。名字的有效区域始于名字的声明,以声明语句所在的作用域末端为结束。
  3. 类型:全局作用域、块作用域(局部作用域)、命名作用域、类作用域
  4. 方式:嵌套作用域(内层作用域、外层作用域)

讲述命名空间?using使用有什么问题?
命名空间:
  1. 大型应用程序使用多个独立开发的库,库定义大量的全局名字(类、函数、模板),可以避免发生名字冲突。
  2. 每个命名空间都是一个作用域(该空间遵循名字唯一、不同空间名字允许相同),命名空间允许不连续(定义在几个不同的地方,新建空间/追加成员,等同于接口与实现分离)
  3. 特殊:未命名的命名空间(等同于C的文件内使用static的静态声明,实现文件间的间隔)
using
  1. using声明(using std::cout)和using指示(using namespace std),前者是每一个成员单独声明,后者是一次性注入改命名空间所有的成员
  2. 头文件与using的注意事项:不能在头文件的全局作用域内使用using

STL默认的内存池实现方式?

迭代器失效问题? 链接1链接2

C++的struct和class关系?(求职指南有)

C++的class作用是什么?[E C++135]
引入一个崭新的数据类型,能够更直接地在我们所设计的程序系统中,表现我们想表现的实体。

说出new delete与malloc free的联系和区别

基于对象与面向对象,有何区别? 链接
所以,写C语言的人通常使用基于对象,但写C++的人可能会使用两种,根据实际应用特性选择。

简述一下C++的类型转换(具体看C++ Primer-4.11这是静态转换,动态转换在多态中使用)
static_cast,reinterpret_cast,const_cast

C/C++是怎么运行的?
  1. 编译链接,讲述清楚从代码到可执行文件的过程
  2. 装入系统,进程调度、资源分配,从可执行文件的分布映射到程序运行的内存分布

printf函数是怎么实现传参的?

实现库函数

atoi

itoa

strcpy

memcpy

memmove


实现C++类

手写一个string

手写一个有理数类?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值