Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

腾讯后台开发面试笔试C++知识点参考笔记 #8

Open
lemonchann opened this issue Jan 29, 2020 · 0 comments
Open

腾讯后台开发面试笔试C++知识点参考笔记 #8

lemonchann opened this issue Jan 29, 2020 · 0 comments

Comments

@lemonchann
Copy link
Owner

https://lemonchann.github.io/cpp_reference/

文章是由自己笔试面试腾讯的笔记整理而来,整理的时候又回顾了一遍,中间工作忙断断续续整理了半个月,才完成现在的样子。主要是针对面试的C++后台开发岗位,涵盖了大部分C++相关的可能会被问到的技术点,作为面试技术的参考回头查阅。

这篇笔记是基础C++知识点总结,没有过多的阐述后台开发的系统架构和分布式后台服务设计相关,还有c++11新特性,这些笔试面试也会被问到但不在这篇讨论范围,可以关注专栏后面如果有机会再补上。

阅读提示

文章约12839字,阅读时长预计33分钟。建议关注收藏方便回头查阅。

为什么析构函数要是虚函数?

基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。

gdb调试命令

step和next的区别?

当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数.

查看内存

(gdb)p &a //打印变量地址

(gdb)x 0xbffff543 //查看内存单元内变量

0xbffff543: 0x12345678

(gdb) x /4xb 0xbffff543 //单字节查看4个内存单元变量的值

0xbffff543: 0x78 0x56 0x34 0x12

多线程调试

(gdb) info threads:查看GDB当前调试的程序的各个线程的相关信息

(gdb) thread threadno:切换当前线程到由threadno指定的线程

break filename:linenum thread all 在所有线程相应行设置断点,注意如果主线程不会执行到该行,并且启动all-stop模式,主线程执行n或s会切换过去

  set scheduler-locking off
  on\step    默认off,执行s或c其它线程也同步执行。on,只有当前相称执行。step,只有当前线程执行

show scheduler-locking 显示当前模式

thread apply all command 每个线程执行同意命令,如bt。或者thread apply 1 3 bt,即线程1,3执行bt。

查看调用堆栈

(gdb)bt

(gdb)f 1 帧简略信息

(gdb)info f 1 帧详细信息

断点

b test.cpp:11

b test.cpp:main

gdb attach 调试方法:

gdb->file xxxx->attach pid->这时候进程是停止的->c 继续运行

带参数调试

输入参数命令set args 后面加上程序所要用的参数,注意,不再带有程序名,直接加参数,如:

(gdb)set args -l a -C abc

list命令

list linenum  显示程序第linenum行的周围的程序

list function  显示程序名为function的函数的源程序

static关键字的作用

软硬链接

ln -s 源文件 目标文件, ln -s / /home/good/linkname链接根目录/到/home/good/linkname

1、软链接就是:“ln –s 源文件 目标文件”,只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间,类似与windows的快捷方式。

2、硬链接ln源文件目标文件,没有参数-s, 会在选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

函数指针

函数指针 int (*func)(int, int)

函数指针数组 int (*funcArry[10])(int, int)

const int* p; 指向const int的指针

int const* p; 同上

int* const p; const指针

设计模式

单例模式

观察者模式(也叫发布订阅模式)

工厂模式 三种:简单工厂模式、工厂方法模式、抽象工厂模式

为什么要用工厂模式?原因就是对上层的使用者隔离对象创建的过程;或者是对象创建的过程复杂,

使用者不容易掌握;或者是对象创建要满足某种条件,这些条件是业务的需求也好,是系统约束也好

,没有必要让上层使用者掌握,增加别人开发的难度。所以,到这时我们应该清楚了,无论是工厂模式,

还是上面的战友说的开闭原则,都是为了隔离一些复杂的过程,使得这些复杂的过程不向外暴露,

如果暴露了这些过程,会对使用者增加麻烦,这也就是所谓的团队合作。

数据结构

各种排序算法

堆排序

关键:1.初始建堆从最后一个非叶节点开始调整 2.筛选从顶点开始往下调整

通俗易懂的快排

二叉树定理

度为2节点数 = 叶子节点数 - 1

证明:树枝数=节点数-1, n00 +n11 +n2*2 = n0+n1+n2-1 (n0代表度为0的节点数,以此类推)

互斥锁

pthread_mutex_t m_mutex;
pthread_mutex_init(&m_mutex, NULL)等效于pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
pthread_mutex_lock(&m_mutex);
pthread_mutex_unlock(&m_mutex)
pthread_mutex_destroy(&m_mutex)
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void ), void arg);
bool g_flag = false;
void
t1(void
arg)
{
cout <<

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant