程序员面试宝典C++

名词解释

1.数据抽象

  • 数据抽象是一种依赖于接口和实现分离的编程技术。
  • 令程序员可以忽略类型的实现细节,只关注类型执行的操作
  • 保证类内数据的安全性,不被随意修改

2.构造函数

  • 对象创建时,用来控制对象初始化过程的函数叫作构造函数。
  • 构造函数的任务是初始化类对象的数据成员

3.各种构造函数

  • 默认构造函数:当没有提供任何实参时使用的构造函数
  • 显式构造函数:可以用一个单独的实参调用但是不能用于隐式转换的构造函数
  • 合成默认构造函数:没有显式地定义任何构造函数类,编译器会为其创建合成默认构造函数

4.友元

  • 类向外部提供其非公有成员访问权限的方式
  • 友元的访问权限和成员函数一样
  • 友元可以是类也可以是函数

5.拷贝构造函数

  • 将新对象初始化为同类型另一对象的副本
  • 当以传值的方式向函数传递对象或者从函数返回对象时会隐式使用拷贝构造函数

6.删除的函数

  • 不能使用的函数
  • =delete
  • 用途是告诉编译器不要合成拷贝操作

7.析构函数

  • 释放对象使用的资源,并销毁对象的非静态数据成员
  • 当对象离开作用域或者被释放时进行清理工作
  • 编译器会自动销毁每个数据成员。类类型的成员调用其析构函数来销毁。内置类型或者复合类型 的成员的销毁不需要任何操作

8.重载运算符

  • 一种函数
  • 重定义了运算符应用于类类型对象时的含义

9.各种合成函数

  • 合成赋值运算符
    • 编译器为未显示定义对应的构造函数的类创建的合成的拷贝赋值运算符版本
    • 除非定义为删除的,合成赋值运算符会逐成员将右侧运算对象赋予左侧运算对象
  • 合成拷贝构造函数
    • 除非定义为删除的,合成拷贝构造函数分别从给定对象拷贝成员来逐成员地初始化新对象
  • 合成析构函数
    • 函数体为空

10.抽象基类

  • 含有纯虚函数的类,无法创建抽象基类的对象

11.基类

  • 可供其他类继承的类。基类的成员也将成为派生类的成员

12.动态绑定

  • 使用动态绑定,可以在一定程度上忽略相似类型的区别
  • 直到运行时才确定到底执行函数的哪个版本
  • 运行时根据引用或者指针所绑定对象的实际类型来选择执行虚函数的某一个版本

13.动态类型

  • 对象在运行时的类型
  • 引用所引对象或者指针所指对象的动态类型可能与该引用或指针的静态类型不同
  • 基类的指针或引用可以指向或者引用一个派生类对象。在这样的情况下:
    • 静态类型是基类的引用或者指针
    • 动态类型是派生类的引用或指针

14.继承

  • 使用继承,可以定义相似的类型,并对其相似关系建模
  • 有一个已有的基类定义一个派生类的技术
  • 派生类将继承基类的成员
  • 不同类型
    • 私有继承:基类的公有成员和受保护的成员是派生类的私有成员
    • 公有继承:基类的公有接口是派生类共有接口的组成部分
    • 受保护的继承:基类的公有成员和受保护成员是派生类的受保护成员

15.覆盖

  • 派生类中定义的虚函数如果与基类中定义的同名虚函数有相同的形参列表,则派生类版本将覆盖基类的版本

16.多态

  • 多态是指程序能通过引用或指针的动态类型获取类型特定行为的能力
  1. 纯虚函数
  • 在类的内部声明虚函数时,在分号之前使用=0
  • 一个纯虚函数不需要被定义。
  • 纯虚函数表明该基类成员函数没有实际意义,是作为一个抽象意义存在

18.重构

  • 通常情况下,重构类的方式是将数据成员和函数成员移动到继承体系的高级别节点中,避免代码冗余

19.虚函数

  • 通过引用或指针对虚函数的调用直到运行是才被解析

指针和引用的区别:

  • 非空区别:指针可以不指向任何对象,而引用则必须指向一个对象
  • 合法性区别:使用引用之前不需要测试合法性,而使用指针则需要考虑指针是否为空
  • 可修改区别:可以修改指针指向哪个对象,但是引用指向的对象不能改变
  • 应用区别:
    • 使用指针:
      • 存在不指向任何对象的可能
      • 需要能够在不同时刻指向不同对象
    • 使用引用:总是指向一个对象,不会改变指向时尽量使用引用。

野指针

  • 指向一个已经删除的对象或者未申请,访问受限内存区域的指针
  • 成因:
    • 指针变量未初始化
    • 指针释放后未置空
    • 指针操作超越变量的作用域
  • 规避:
    • 初始化时置为NULL
    • 释放时置为NULL

内联函数和宏

  • 将函数指定为内联函数,通常是将它在每个调用点上 内联地 展开→消除了函数在运行时的开销。
  • 内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。
  • 宏只是一个简单的替换。
  • 内联函数要做参数检查而宏不需要。
  • 内联函数和宏相比没有付出额外代价的情况下更安全。
  • 内联函数一般只用于如下情况:一个函数被不断重复调用;函数只有简单的几行且不包含for/while/switch语句。
  • 类的构造函数和析构函数尽量在类外定义,因为类内定义即为内联函数。

malloc/free和new/delete的区别

  • 前者是标准库函数,后者是运算符,都可以用于申请动态内存和释放内存
  • 对于非内部数据类型的对象而言,前者只能分配内存区域,而无法执行构造函数和析构函数

this指针

  • 本质是一个函数参数, 指向调用当前成员函数对象的常量指针
  • 成员函数开始前构造,成员函数结束后清除
  • 不占用对象的空间

类的静态成员

构造函数、析构函数、拷贝构造函数、拷贝赋值运算符

虚函数

  • 是否可以把每个函数都声明为虚函数
    • 不行,每个虚函数的对象都必须维护一个虚函数表,因此在使用虚函数时会产生额外的系统开销。
    • 虚函数表:一个类的虚函数的地址表

友元

  • 不是类的成员函数但是可以访问类的私有成员
  • 需要在类内声明,在类外定义
  • 可以是函数也可以是一个类

重载、重写

  • 重写(override)是一种面向对象的编程。是指派生类重写基类的虚函数,重写的函数必须有一致的参数表和返回值。
  • 重载(overload)是一种语法规则,指编写一个与已有函数同名但是参数表不同的函数。

你可能感兴趣的:(程序员面试宝典C++)