
C/C++面试题
文章平均质量分 89
不会code的菜鸟
这个作者很懒,什么都没留下…
展开
-
多态内容:虚函数、纯虚函数、抽象类、虚析构函数、虚拟继承
C++面向对象之多态什么是多态?为什么使用多态?虚函数的定义虚函数的实现机制哪些函数不能被设置为虚函数?虚函数的访问指针访问引用访问对象访问成员函数中的访问构造函数和析构函数中访问纯虚函数抽象类虚析构函数重载、隐藏、覆盖虚拟继承虚拟继承时派生类对象的构造和析构什么是多态?**多态性( polymorphism )**是面向对象设计语言的基本特征之一。仅仅是将数据和函数捆绑在一起,进行类的封装,使用一些简单的继承,还不能算是真正应用了面向对象的设计思想。多态性是面向对象的精髓。多态性可以简单地概括为“一个原创 2020-06-15 15:27:36 · 369 阅读 · 0 评论 -
排序算法——快速排序
快速排序快速排序也称为分区排序,该算法采用了一种分治的策略,其基本思想是取待排序序列中的某个对象为基准(比如第一个对象)。按照关键码的大小,将整个对象序列划分为左右两个子序列:左侧子序列中所有对象的关键码都小于或等于基准对象的关键码,右侧子序列中所有对象的关键码都大于基准对象的关键码,基准对象排在这两个子序列中间,然后分别对两个子序列重复实施上述方案,直到排序完成为止。数组分区、递归求解是快速排序的核心思想,数组的两个分区具有下面的属性,S1分区的所有项都小于基准项p,而S2分区的所有项都大于等于p。这原创 2020-06-10 16:55:44 · 582 阅读 · 0 评论 -
排序算法——堆排
堆排序如果将堆结构中的数据看作是一颗完全二叉树的各个节点,那么堆的性质就是满足如下性质的完全二叉树:树中任意非叶子节点的关键码均不大于或不小于其左右孩子节点的关键码。利用堆的有序性及其运算,可以容易的实现选择排序的方法称为堆排序。假设欲对含有n个对象的序列v[0]、v[1]、v[n-1]进行堆排序,算法主要分为两个步骤:一是根据初始输入数据利用堆的调整算法形成初始堆,二是通过一系列的对象交换和重新调整对堆进行排序。具体的过程是在首次获得最大堆之后,将关键字最大的元素v[0](即堆顶)和无序区的最后一个元原创 2020-06-10 16:36:08 · 287 阅读 · 0 评论 -
为什么TCP连接需要三次握手和四次挥手、存在TIME_WAIT状态的两个理由
1、三次握手建立连接详解三次握手的大致流程如下:(1)客户端向服务器发送一个SYN J;(2)服务器向客户端响应一个SYN K,并对SYN J 进行确认 ACK J+1;(3)客户端再向服务器发送一个确认ACK K+1。这样就完成了三次握手,但是这个三次握手发生在哪几个函数中呢?从图中可以看出,服务器必须准备接受外来的连接。这通过socket、bind和listen函数来完成,称为被动打开。客户端通过调用connect进行主动打开。这引起客户端向服务器发送了SYN J(表示同步,它告诉服务器原创 2020-06-10 12:11:36 · 433 阅读 · 0 评论 -
UDP协议、TCP协议
1、UDP用户数据报协议(User Datagram Protocol)。UDP是一种无连接协议,因为UDP客户与服务器不存在长期的关系,例如一个UDP客户创建一个套接字并发送一个数据报给一个服务器,然后立即用同一个套接字发送另一个数据报给另一个服务器。同样,一个UDP服务器可以用同一个UDP套接字从若干不同的客户端一连串接收多个数据报。UDP不是可靠的,不能保证最终到达它们的目的地,不保证各个数据报的先后顺序跨网络保持不变,也不能保证每个数据报只到达一次。UDP即可以使用IPV4,也可以使用IPV6原创 2020-06-10 10:42:44 · 404 阅读 · 0 评论 -
指针和引用的区别
一、指针和引用的定义和性质区别(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元,即指针是一个实体;而引用跟原来的变量实质上是一个东西,只不过是原变量的一个别名而已。如:int a = 1; int *p = &a;int a = 1; int &b = a;上面定义了一个整型变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。而下面2句定义了一个整型变量a和这个整型a的引用b,事实上a和b是同一个东西,在内存占有同一个存转载 2020-06-10 09:23:48 · 16899 阅读 · 4 评论 -
内存对齐的原因和规则
内存对其的解释:对齐规则是按照成员的声明顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍。为什么要内存对齐?原因有以下几点:1、CPU对内存的读取不是连续的,而是分成块读取的,块的大小只能是1、2、4、8、16…字节;参考:https://blog.youkuaiyun.com/mtv_zmx/article/details/89954562、当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣;参考:https://blog.c原创 2020-06-09 20:57:59 · 634 阅读 · 0 评论 -
sizeof与strlen有哪些区别
摘自:C和C++程序员面试秘籍它们的区别如下:1)sizeof是操作符,strlen是函数。2)sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int 类型,该类型保证能容纳实现所建立的最大对象的字节大小。3)sizeof可以用类型做参数,strlen只能用char *做参数,且必须是以\0结尾的。4)数组做sizeof的参数不退化,传递给strlen就退化为指针了。5)大部分编译程序在编译的时候sizeof就被计算过了,这就是sizeof(x)可以用来原创 2020-06-09 18:42:14 · 232 阅读 · 0 评论 -
C/C++ static关键字的作用
1、先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global variablevoid msg(){ printf("Hello\n");}//main.cint main(){ extern char a;转载 2020-06-09 18:16:15 · 223 阅读 · 0 评论 -
C++中const有什么作用
摘自:C和C++程序员面试秘籍(1)const用于定义常量:const定义的常量编译器可以对其进行数据静态类型安全检查。(2)const修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型时,应该将值传递改为const &传递,可以提高效率。比较下面两段代码:void fun(A a);void fun(A const &a);第一个函数效率低。函数体内产生A类型的临时对象用于复制参数a,临时对象的构造、复制、析构过程都将消耗时间。而第二个函数提高了效率。用引用传递不需要产原创 2020-06-09 16:54:33 · 1898 阅读 · 0 评论 -
堆区和栈区的区别
一、程序内存的区域1、栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们说的栈,,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存。2、堆区(heap)一般由程序员分配释放,若是程序员不释放,程序结束时可能由操作系统回收,类似于链表,在内存中的分布是不连续的,它们是不同区域的内存块通过指针链接起来的。一旦某一节点从链中断开,我转载 2020-06-09 16:23:13 · 674 阅读 · 0 评论 -
C++中的delete和delete[ ]的区别
以前看书的时候,书上说使用new申请的内存,释放时用delete,使用new [ ]申请的内存释放时要用delete [ ]才行,这两个一定要记住,申请时用了方括号,则释放时也要加上方括号,否则就会出错。但是并没有解释为什么这样,会出什么错。今天正好看到这个,记录下。关于动态申请的内存,分两种情况:基本数据类型的分配和自定义数据类型的分配。两者不同。1、基本数据类型对于基本数据类型,假如有如下代码int *a = new int[10];.......delete a; //方式1转载 2020-06-08 20:18:21 · 1387 阅读 · 0 评论 -
malloc/free和new/delete的区别
摘自:C和C++程序员面试秘籍malloc与free是C++/C的标准库函数,new/delete是C++的运算符。它们都可以用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此,C++需要一个能够完成动态内存分配和初始化工作的运算符ne原创 2020-06-09 14:45:06 · 222 阅读 · 0 评论