邓某的杂货铺

凡心所向,素履以往;生如逆旅,一苇以航。


  • 首页

  • 归档

  • 关于

  • 标签

  • 分类

C++: 面经*

发表于 2021-04-05 | 分类于 C++

C++ 目前的应用领域

  • 目前常见的桌面应用软件
    QQ、网易云音乐
  • 基础软件和高级语言的运行时程序
    大型数据库软件、Java虚拟机、Python编译器
  • 业务性应用软件的后台
    游戏服务器后台

C++ 存在的特点

  • C++ 整套的语法不具备“功能完备性”,单纯地使用这门语言本身提供的功能无法创建任何有意义的程序,必须借助操作系统的 API 接口函数来达到相应的功能。
  • C++ 语言需要直接使用操作系统的接口功能,这就造成了 C++ 语言繁、难的地方。
  • 在应用层开发,直接使用操作系统接口的函数,往往执行效率高、控制力度大。

C++ 的前端(客户端)开发和后端开发

cpp的前端和后端开发并没有优劣之分,二者的区别主要在于侧重点以及开发的思维不同。

前端开发一般有较多的界面逻辑,直接与客户交互,因此侧重点在于界面的易用性和流畅性。
对于后端开发,其主要目的则在于为客户端提供高效的服务,因此侧重点在于请求响应的正确性、及时性以及流畅性。

阅读全文 »

C++: 面向高级对象编程(上)

发表于 2021-04-05 | 分类于 C++

前言

最近看了侯捷老师关于C++的课——《C++: 面向高级对象编程(上)》,感觉收益匪浅,醍醐灌顶,因此将课程中学到的一些比较重要的内容整理出来。

基于对象(Object Based)的程序设计

不带有指针成员变量的类——以复数类complex为例

头文件的结构

![头文件结构.PNG]/images/面向对象编程上/头文件结构.png)

由上图可知,头文件的结构一般包含以下四个部分:

  • 防卫式声明(guard):防止头文件被重复包含
  • 前置声明(forward declarations): 声明头文件中用到的类和函数
  • 类声明(class declarations): 声明类的函数和变量
  • 类定义(class definition): 实现前面声明的函数

访问级别

在 C++ 中包含三种访问级别:

  • private: 只能被本类中的函数访问
  • protected: 能被本类的函数和子类的函数访问
  • public: 可以被所有函数访问
阅读全文 »

Python中的装饰器

发表于 2021-04-05 | 分类于 Python

什么是装饰器?

谈装饰器前,还要先要明白一件事,Python 中的函数和 Java、C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如:

1
2
3
4
5
6
7
def foo():
print("foo")

def bar(func):
func()

bar(foo)

正式回到我们的主题。装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
先来看一个简单例子,虽然实际代码可能比这复杂很多:

1
2
def foo():
print('i am foo')

现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码:

1
2
def foo():
print('i am foo')

如果函数 bar()、bar2() 也有类似的需求,怎么做?再写一个 logging 在 bar 函数里?这样就造成大量雷同的代码,为了减少重复写代码,我们可以这样做,重新定义一个新的函数:专门处理日志 ,日志处理完之后再执行真正的业务代码

阅读全文 »

计算机组成原理相关知识点整理

发表于 2020-08-22 | 分类于 知识点

计算机概述

  • 吞吐量:系统在单位时间内处理请求的数量
    主要取决于主存的存取周期
  • CPU时钟周期(节拍脉冲,T周期):最小时间单位
    每个动作至少一个时钟周期
  • 主频:CPU时钟频率,时钟周期的倒数
  • CPI:执行一条指令所需要的时钟周期数
  • CPU执行时间,运行一个程序所花费的时间
    $ CP执行时间 = \frac{CPU时钟周期数}{主频} = \frac{指令条数*CPI}{主频}$
  • MIPS:每秒执行多少百万条指令
    $MIPS = \frac{指令条数}{执行时间*10^6}=\frac{主频}{CPI}$
    $指令周期=\frac{1}{MIPS}$
  • 程序员可见的寄存器:
    • 状态寄存器
    • 通用寄存器
  • 程序员不可见(透明)的寄存器:
    • IR
    • MAR
    • MDR
阅读全文 »

计算网络相关知识点整理

发表于 2020-08-21 | 分类于 知识点

概述

OSI 参考模型

  • 应用层:用户与网络的界面,为应用程序提供访问 ISO 的手段
  • 表示层:数据解密加密、压缩、格式转换
  • 会话层:会话管理和同步
  • 传输层:流量控制、差错控制、服务质量、数据传输管理
    • 报文段(TCP)
    • 用户数据报(UDP)
  • 网络层:流量控制、拥塞控制、差错控制、网际互连(分组、数据报)
  • 数据链路层:成帧、差错控制、流量控制、传输管理(帧)
  • 物理层:透明传输比特流(比特)

在ISO/OSI中,网络层支持面向链接和非链接
而在TCP/IP中,则是在传输层

阅读全文 »

数据结构与算法相关知识点整理

发表于 2020-08-20 | 分类于 知识点

概述

数据的逻辑结构.png

存储结构

  • 顺序存储
  • 链式存储
  • 索引存储
  • 散列存储
阅读全文 »

操作系统相关知识点整理

发表于 2020-08-17 | 分类于 知识点

进程

琐碎的知识点

  • 线程是独立调度的基本单位(不拥有系统资源)
    进程是拥有资源的基本单位

  • 进程实体包括:程序段、相关数据段、PCB

  • 周转时间 = 作业完成时间 - 作业提交时间(即进入内存的时间)
    等待时间 = 周转时间 - 执行时间大小
    带权周转时间 = 作业周转时间 / 作业实际运行时间

阅读全文 »

c++中的Lambda表达式

发表于 2020-08-12 | 分类于 C++

Lambda 表达式

谓词函数: 进行一个操作时的一个临时函数,一般使用匿名函数。比如sort函数的第三个参数即传入一个谓词函数

1
std::sort(X, X+N, [](float a, float b) {return std::abs(a) < std::abs(b);});

Lambda 表达式使用一对方括号作为开始的标识,就类似于声明一个函数(也是匿名函数)

1
std::cout<<[](float f) {return std::abs(f);}(-3.5);            // 3.5

当只有一个返回值时,C++会自动判断返回值的类型而无需声明返回值的类型

我们也可以强制将返回值转换为int

1
std::cout<<[](float f) -> int {return std::abs(f);}(-3.5);     // 3

有点 JavaScript 里立即执行函数的味道了

阅读全文 »

设计模式中的六大原则

发表于 2018-12-01 | 分类于 设计模式

单一职责原则

单一职责原则的定义是:应该有且仅有一个原因引起类的变更。

从字面上理解,就是说实例类的职责应该是单一的。一个类只能有一个职责,只负责做一件事。

而且不仅仅是类,其他接口或者方法应该适合该原则。

比如: 修改用户密码的功能不能放到修改用户信息这个方法里面去。

void changeUser(IUserOB userOB, String...changeOptions)

这个方法指责太大了,颗粒度太粗,指责不单一,这样是不对的。

然而,单一指责原则最难划分的就是指责,一般来说,一个指责一个接口,但是“指责”一词很难被量化。需要从具体的项目中出发,去细化指责。

也有不少优秀的类设计是与单一指责相违背的。

所以,最佳实践告诉我们:对于接口要做到单一原则,而类的设计尽量做到只有一个原因引起变化。

单一指责原则的好处:

  • 降低类的复杂度,明确清晰地定义了类的指责
  • 提高代码可读性
  • 提高代码维护性
  • 减少变更引起的风险
阅读全文 »

使用 Vue 进行前端开发

发表于 2018-11-26 | 分类于 JavaScript

众所周知,传统的前端Web开发离不开三件套 HTML、CSS以及JavaScript。

由HTML 负责页面的整体架构,CSS负责美化渲染,而JavaScript则负责处理页面的逻辑。

HTML 的结构依赖于 DOM(Document Object Model) 这样的树形结构,而JavaScript 的逻辑处理操作更多的是对 Dom 节点的操作。为了更好的处理与DOM 节点的交互,出现了像 JQuery 这样优秀的前端框架。

除了传统的前端Web开发以外,还有Web 应用开发基本也遵循 MVC(Model-View-Controller) 的开发模式,基本上View端作为普遍认为的前端领域,无非就是操作DOM 对后端提供的数据进行展示。

随着Web浪潮的迅速发展,人们发现,传统的前端开发模式暴露了以下三个痛点:

  • 对DOM节点的操作(频繁地调用相同的DOM API),处理繁琐,操作冗余,使得代码难以维护。
  • 大量的DOM操作使页面渲染性能降低,加载速度变慢,影响用户体验。
  • 当 Model 频繁发生变化,开发者需要主动更新到View ;当用户的操作导致 Model 发生变化,开发者同样需要将变化的数据同步到Model 中,这样的工作不仅繁琐,而且很难维护复杂多变的数据状态。
阅读全文 »
1234
Austin Deng

Austin Deng

凡心所向,素履以往;生如逆旅,一苇以航。

32 日志
16 分类
34 标签
© 2021 Austin Deng