![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
程序员面试笔试宝典笔记(C++版)
小肥羊的慢慢科研路
希望这里能见证我的慢慢科研路
展开
-
友元
友元出现的原因类具有封装、继承、多态、信息隐藏的特性。只有类的成员函数才可以访问类的标记为private的私有成员,非成员函数可以访问类中的公有成员,但是却无法访问私有成员,为了使非成员函数可以访问类的成员,唯一的做法就是将成员都定义为public,但如果将数据成员都定义为公有的,这又破坏了信息隐藏的特性。而且,对某些成员函数多次调用时,由于参数传递、类型检查和安全性检查都需要时间开销,从而影响...原创 2018-08-21 22:35:29 · 185 阅读 · 0 评论 -
typedef和define有什么区别
typedef和define都是替一个对象取一个别名,以此增强程序的可读性,区别如下:(1)原理不同#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typede...原创 2018-07-04 21:18:33 · 81529 阅读 · 19 评论 -
枚举和define有什么不同
枚举常量是实体中的一种,而宏定义不是实体枚举常量属于常量,但宏定义不是常量枚举常量具有类型,但宏没有类型,枚举常量具有与普通变量相同的性质,如作用域、值等,但宏没有#define宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值一般在编译器里,可以调试枚举常量,但是不能调试宏常量枚举可以一次定义大量相关的变量,而#define宏一次只能定义一个...原创 2018-07-04 20:54:58 · 809 阅读 · 0 评论 -
不使用sizeof,如何求int占用的字节数
1、使用宏定义的方法#define MySizeof(Value) (char*)(&Value + 1) - (char*)&Value其中(char*)&Value返回Value的地址的第一个字节,(char*)&(Value + 1)返回Value的地址的下一个地址的第一个字节,他们之差为它所占的字节数。2、如下所示#include <iostream&...原创 2018-07-04 20:36:29 · 1144 阅读 · 0 评论 -
new/delete与malloc/free的区别是什么
作用:申请动态内存和释放动态内存相同点:存储方式相同,new与malloc动态申请的内存都位于堆中,无法被操作系统自动回收,需要对应的delete/free来释放空间,对一般数据类型,如char、int,效果相同不同点:(1)new能够自动计算需要分配的内存空间,而malloc需要手工计算字节数,例如,int* p1 = new int[2], int* p2 = malloc(2 * sizeo...原创 2018-06-28 21:44:54 · 315 阅读 · 0 评论 -
如何进行float、bool、int、指针变量与“零值”的比较
(1)int类型推荐:if(n == 0)if(n != 0)不推荐:if(n)if(!n)(2)float类型无论是float或double类型的变量,由于他们在内存中的存储机制与整型数不同,有舍入误差,所以在计算机中,大多数浮点数都无法精确表达,很难用A==B来判定两个浮点数是否相同。在判断浮点数相等是,推荐用范围来确定,若x在某一范围内,就认为是相等,至于范围怎么定义,要依据情况而定,flo...原创 2018-06-28 21:10:18 · 525 阅读 · 0 评论 -
C++函数传递参数的方式有哪些?
C++函数传递参数的方式有以下四种(1)值传递当进行值传递时,就是将实参的值复制到形参中,而形参和实参不是同一个存储单元,所以函数调用结束后,实参的值不会发生改变。(2)指针传递当进行指针传递时,形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。这种方式还是“值传递”,只不过实参的值是变量的地址而已。而在函数中改变的不是实参的值,而是实参地址所指向的变量的值。(3...原创 2018-07-10 21:47:28 · 1423 阅读 · 0 评论 -
a是变量,执行(a++)+= a语句是否合法
左值可以出现在表达式左边的值(等号左边),可以被修改,它是存储数据值的那块内存的地址,也称为变量的地址右值存储在某内存地址中的数据,也称为变量的数据!左值可以作为右值,但右值不可以是左值本题不合法a++不能当做左值使用,++a可以当做左值使用。++a表示取a的地址,对他的内容进行加1操作,然后把值放回寄存器中,a++表示取a的地址,把它的值装入寄存器,然后再对内存中的a执行加1操作。a++的运算结...原创 2018-06-28 18:01:48 · 2861 阅读 · 0 评论 -
前置运算和后置运算有什么区别 C++
以++为例++a,表示取a的地址,增加它的内容,然后把值放在寄存器中a++,表示取a的地址,把它的值装入寄存器,然后增加内存中a的值一般,当涉及到表达式计算时,后置的++运算符是先将其值返回,然后值增1前置的++运算符是先将值增1,再返回其值需要注意的是:对于迭代器和其他模板对象使用前缀形式(++i)的自增,自减运算符,一般推荐使用前置自增运算符,因为前置自增通常比后置自增的效率更高...原创 2018-06-28 17:53:44 · 2401 阅读 · 0 评论 -
*p++和(*p)++等价么?(宝典笔记)
操作符的优先级总结:(1)关系运算符优于逻辑运算符(2)移位运算符结语算数运算符和比较运算符之间(3)除单目运算符外,算术运算符的优先级最高两者不等价,因为优先级顺序不同,前者先完成取值操作,再对指针地址进行++操作了让后者先执行取值操作,再对该值进行++运算注:运算符的结合性也有所不同,单目、三目、赋值运算符是从右往左,其余均是从左往右...原创 2018-06-28 17:43:25 · 483 阅读 · 0 评论 -
函数指针和指针函数的区别?
指针函数是指带指针的函数,本质上是一个函数,函数返回类型是某一类型的指针,其形式一般如下所示:类型标识符 *函数名(参数列表)函数指针是指向函数的指针变量,本质上是一个指针变量,表示的是一个指针,它指向的是一个函数,其形式一般如下:类型说明符 (*函数名)(参数)例如,int(*pf)(int x),它的意思就是声明一个函数指针,而pf = func,则是将func函数的首地址赋值给指针。引申1:...原创 2018-07-10 21:34:24 · 7234 阅读 · 0 评论 -
宏定义与内联函数的区别
宏定义预处理器用复制宏代码的方式代替函数调用,省去了参数压栈,生成汇编语言的CALL调用,返回参数,执行return等过程,从而提高了速度内联函数是代码被插入到调用者代码处的函数。只适合函数体内代码简单的函数使用,不能包含复杂的结构语句(如while、switch),并且内联函数本身不能调用递归函数,此外,如果内联函数体过大,编译器会放弃内联方式,采用普通方式调用区别1. 宏定义是在预处理阶段进行...原创 2018-07-04 21:36:35 · 253 阅读 · 0 评论 -
定义常量谁更好?#define还是const
两者区别1. define只是用来进行单纯的文本替换,define常量的声明周期止于编译期,不分配内存空间,它存在于程序的代码段,在实际程序中它只是一个常数,一个命令中的参数并没有实际的存在;而const常量存在于长须的数据段,并在堆栈中分配了空间,const常量在程序中确实存在,且可以被调用、传递2. const常量有数据类型,而define常量没有数据类型,编译器可以对const常量进行类型安...原创 2018-07-04 21:45:24 · 2091 阅读 · 0 评论 -
重载、覆盖、隐藏
重载是指函数不同的参数表(参数的类型、个数、顺序不同),对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。对于重载函数的调用,在编译期间就已经确定,是静态的,它们的地址在编译期间就绑定了与多态无关。注意,重载不关心函数的返回值类型。成员函数被重载的特征如下:(1)相同的范围(在同一个类中)(2)函数名字相同(3)参数列表不同(4)virtual关键字可有可无覆...原创 2018-07-11 19:45:06 · 122 阅读 · 0 评论 -
深拷贝、浅拷贝
如果一个类拥有资源(堆或者是其他系统资源),当这个类的对象发生复制过程时,资源重新分配,这个过程就是深拷贝;反之对象存在资源,但复制过程并未复制资源的情况视为浅拷贝。浅拷贝,在释放资源时,可能会善生资源归属不清的情况,导致程序出错。因为原变量与复制变量指向同一块内存地址,当调用析构函数释放原变量地址时,复制变量若是指针的话,则会成为野指针。...原创 2018-08-21 21:43:04 · 211 阅读 · 0 评论 -
交换机和路由器有什么区别
交换机是一种基于MAC(网卡的硬件地址)识别,能完成封装转发数据包功能的网络设备。它具有流量控制能力,主要用于组建局域网。例如,搭建一个公司网络,一般会使用交换机。常见的交换机种类有以太网交换机、光纤交换机等。路由器是连接Internet中各局域网、广域网的网络设备。它是网络的枢纽,是组成广域网的重要部分,用于为数据包找到最合适的到达路径。交换机和路由器的区别如下:工作层次不同...原创 2018-08-24 11:00:29 · 926 阅读 · 0 评论 -
MVC模型结构是什么?
MVC是模型(Model)、视图(View)和控制(Controller)这3个单词的第一个字母。它是一种目前广泛流行的应用模型,它的目的是实现Web系统的职能分工。模型层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现;视图层则是用于与用户的交互,通常用JSP来实现;控制层则是模型与视图View之间沟通的桥梁。它可以把用户的请求分派并选择恰当的视图来显示它们,同时它也可以解释用户的...原创 2018-08-23 15:58:35 · 2448 阅读 · 0 评论 -
B/S和C/S有什么区别
C/S是Client/Server(客户端/服务器)的缩写,在C/S架构中,服务器通常曹勇高性能的PC、工作站或者小型机,而且采用大型数据库系统,如SQL Server、DB2、Oracle或Sybase等。客户端需要安装专用的客户端软件。B/S是Browser/Server(浏览器/服务器)的缩写,客户端通常只需要安装一个浏览器(Browser),如Firefox、IE、Chrome等即...原创 2018-08-23 09:49:54 · 981 阅读 · 0 评论 -
复制构造函数与赋值运算符的区别是什么
复制构造函数是一种特殊的构造函数,在生成一个实例的时候,一般会同时生成一个默认的复制构造函数,复制构造函数完成一些基于同一类的其他对象的构建及初始化工作。拷贝构造函数的特点该函数名与类名同名,因为它也是一种构造函数,并且该函数不指定返回类型 该函数只有 一个参数,并且是对某个对象的引用 每个类都必须有一个复制构造函数 如果程序员没有显式地定义一个复制构造函数,那么,C++编译器会自动...原创 2018-08-22 20:38:11 · 3280 阅读 · 0 评论 -
如何实现位操作求两个数的平均值
一般方法:(x + y) / 2存在问题:当两个数比较大时,如果两个数的和大于了机器位数能够表示的最大值,可能会存在数据溢出的情况改进:采用位运算方法(x & y) + ((x ^ y) >> 1)(x & y) + ((x ^ y) >> 1), (x & y)表示的是取出x与y二进制位数中都为“1”的所有位,x^y表示的是x与y中有一个为“1”的...原创 2018-07-05 21:04:09 · 864 阅读 · 0 评论 -
最有效的计算2乘以8的方法是什么?
2<<3CPU直接支持位运算,效率最高。一个数左移n位,相当于乘以了2的几次方。右移则相当于除法引申:如何快速求取一个整数的7倍?(X << 3) - X 注意:由于-的优先级高于<<,所以不能去掉括号,否则结果不正确...原创 2018-07-05 20:48:06 · 5166 阅读 · 0 评论 -
C++中struct与class的区别是什么?
如果没有多态和虚拟继承,在C++中,struct和class的存取效率完全相同,存取class的数据成员与非虚函数效率和struct完全相同,不管该数据成员是定义在基类还是派生类。class的数据成员在内存中的布局不一定是数据成员的声明顺序,C++只保证处于同一个access section的数据成员按照声明顺序排列在C++中,class和struct做类型定义是只有两点区别:默认继承权限不同,c...原创 2018-07-05 20:11:51 · 17295 阅读 · 0 评论 -
C和C++中struct的区别是什么
C语言的struct不能有函数成员,而C++的struct可以有; C语言的struct中数据成员没有private、public和protected访问权限的设定,而C++的struct的成员有访问权限设定; C语言中的struct是没有继承关系的,而C++的struct却有丰富的继承关系。C语言中的struct是用户自定义数据类型(User Defined Type),它是没有权限设置的...原创 2018-07-05 19:54:08 · 3645 阅读 · 0 评论 -
C语言中struct与union的区别是什么?
相同struc(结构体)与union(联合体)都是符合结构,由多个不同的数据类型成员组成。不同1. 占用地址空间unionunion所有成员共用一块地址空间,即联合体只存放了一个被选中的成员。所有成员不能同时占用内存空间,它们不能同时存在,所以一个联合型变量的长度等于其最长的成员的长度。structstruct中所有成员占用空间是累加的,其所有成员都存在,不同成员会存放在不同的地址。在计算一个结构...原创 2018-07-05 19:38:34 · 1299 阅读 · 0 评论 -
如何判断一个变量是有符号数还是无符号数?
(1)采用取反操作若该值与其求反后的值都大于0,则该数为无符号数,反之则是有符号数。解析:因为数据在计算机中都是以二进制的0或1存储的,证书以0开头,负数以1开头,求反操作会把所有的0改为1,所有的1改成0,如果是有符号数,那么取反后,开头的0会被改成1,开头的1会被改成0,即正负有变化,但如果是无符号数则不会受此影响。(2)利用无符号数和有符号数详见的结果为无符号数(3)通过改变符号位判断,把A...原创 2018-07-03 19:52:25 · 9556 阅读 · 0 评论 -
不能使用大于、小于、if语句,如何定义一个宏来比较两个数a、b的大小
用三目运算符如:简单比较:#define check(a, b) (((a) - (b)) = fabs((a) - (b))) ? "greater" : "smaller"返回较大值:#define MAX(a, b) (abs((a) - (b)) = ((a) - (b)) ? (a) : (b)) 缺点:可能存在精度误差改进:#define MAX(a, b) (fabs((a) - (...原创 2018-07-03 19:39:28 · 2309 阅读 · 1 评论 -
含参数的宏与函数有什么区别?
含参数的宏有时完成的是函数实现的功能,但是并非所有的函数都可以被含参数的宏所替代,各自特点如下:函数调用时,首先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。函数调用是在程序运行时处理的,它需要分配临时的内存单元;而宏展开是在编译时进行的,在展开时并不分配内存单元,也不进行值的传递处理,也没有“返回值”的概念。对函数中的实参和形参都要定义类型,两者的类型要求一致,如果不一...原创 2018-07-03 19:13:10 · 1930 阅读 · 0 评论 -
sizeof C++
未完待续问题1:sizeof是关键字么?sizeof是数据类型的关键字,而非函数。引申:预处理指令是否是C语言中的语言类型?不是。C语言中的语言类型一共有以下5种:(1)表达式语句(2)函数调用语句(3)控制语句(4)复合语句(5)空语句注意:由于预处理指令的结尾不能添加分号,所以预处理指令不是语句问题2:strlen("\0") = ? sizeof("\0") = ?strlen("\0") ...原创 2018-06-30 22:04:49 · 356 阅读 · 0 评论 -
什么是缓冲区溢出 C++
缓冲区定义缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据。缓冲区溢出定义是指当向缓冲区内填充数据位数超过了缓冲区自身的容量限制时,发生溢出的数据覆盖在合法数据(数据、下一条指令的指针、函数返回地址等)上的情况溢出原因由于大多数程序都会假设数据长度总是与所分配的存储数据相当,进而存在缓冲区溢出安全隐患,最好的情况是程序不允许输入超过缓冲区长度的字符并检查数据长度。攻击方式人为的...原创 2018-06-30 10:20:07 · 1727 阅读 · 0 评论 -
栈和堆的空间大小 C++
栈在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。栈顶的地址和栈的最大容量是系统预先规定好的,在Window下,栈的大小是2MB,Linux下,默认栈空间大小为8MB,可通过ulimit -s来设置。特点:栈的速度快、空间小,不灵活堆堆是向高地址扩展的数据结构,是不联系的内存区域。这是由于系统是用链表来存储空闲内存地址的,自然是不连续的,而链表的便利方向是由低地址向高地址的。...原创 2018-06-29 21:18:34 · 13677 阅读 · 0 评论 -
内存分配的形式有哪些? C++
一个C/C++编译的程序所占用的系统内存一般分为以下几个部分由符号起始的区块(Block Started by Symbol,BSS)段:BSS段通常是指用来存放程序中未初始化的全局数据和静态数据的一块内存区域。BSS段属于静态内存分配,程序结束后静态变量资源由系统自动释放。数据段(data segment):数据段通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。...原创 2018-06-29 20:47:27 · 271 阅读 · 0 评论 -
如何定义和实现一个类的成员函数为回调函数
回调函数定义就是被调用者回头调用的函数,它是通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所所指向的函数时,此时,就可以称它为回调函数。进一步解释回调函数不是由该函数的实现方直接调用的,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为...原创 2018-06-29 20:01:09 · 3350 阅读 · 0 评论 -
C++中异常的处理方法以及使用了哪些关键字
C++异常处理使用的关键字有:try、catch、throw。C++中的异常处理机制只能处理由throw捕获的异常,没有捕获的将被忽略。使用try({}catch{}语句来捕获异常,把可能发生异常的代码放在try语句块中,后面跟若干个catch{}负责处理具体的异常类型,这样一组有try块和不少于一个的catch块就构成了一级异常捕获。如果本级没有带死党类型参数的catch块,将不能捕获异常,异常...原创 2018-06-29 16:28:43 · 1876 阅读 · 0 评论 -
在C++中,关键字explicit有什么作用
作用声明为explicit的构造函数不能在隐私转换中使用,只能被显式调用举例:class String{ String(const char* p); ...}String s1 = "hello";上述声明是合法的,等价于,String s1 = String("hello")为了避免这种情况的发生,C++引入关键字explicit,它可以组织不应该允许的经过转换构造函数进行的隐式转...原创 2018-06-29 16:08:21 · 586 阅读 · 0 评论 -
在C++中如何实现模板函数的外部调用
export是C++新增的关键字,它的作用是实现模板函数的外部调用,类似extern关键字。为了访问其他代码文件中的变量或对象,对普通类型(包括基本数据类、结构和类)可以利用关键字extern来使用这些变量或对象,但对于模板类型,则可以在头文件中声明模板类和模板函数,在代码文件中使用关键字export来定义具体的模板类对象和模板函数,然后在其他用户代码文件中,包含声明头文件后,就可以使用这些对象和...原创 2018-06-29 15:43:38 · 4942 阅读 · 1 评论 -
exit(status)是否跟从main()函数返回的status等价
在C语言标准中,它们是等价的,但是如果在退出的时候需要使用main()函数的局部数据,那么从main()函数当中使用return()就不行了。return功能返回函数调用,如果返回的是main()函数,则为退出程序exit功能在调用处强行退出程序,运行一次程序就结束。exit(0)是程序结束返回0给系统,正常退出;exit(1)程序结束时返回1给系统;exit(n)程序结束时返回结束时返回n给系统...原创 2018-06-29 15:34:50 · 546 阅读 · 0 评论 -
C语言中,整型变量x小于0,是否可知x*2也小于0
假定计算机是32位的,用2的补码表示整数,若x<0,则x*2<0不一定成立,如,当x为整型值的最小时就不成立。原创 2018-06-29 15:16:43 · 1117 阅读 · 1 评论 -
使用指针有哪些好处? C++
定义指针包含的是一个指向内存中某个位置的地址。好处可以动态分配内存进行多个相似变量的一般访问为动态数组结构,尤其是树和链表,提供支持遍历数组,如解析字符串高效的按引用“复制”数组与结构,特别是作为函数参数的时候,可以按照引用传递函数参数,提高开发效率...原创 2018-07-01 12:44:02 · 3506 阅读 · 0 评论 -
引用还是指针?
引用定义引用其实就是别名,用于定义一个变量来共享另一个变量的内存空间,变量是一个内存空间的名字,如果给内存空间起了另一个名字,那就能够共享这个内存了,进而提高程序的开发效率。指针定义指针指向另一个内存空间的变量,可以通过它来索引另一个内存空间的内容,而指针本身也有自己的内存空间。相同点指针指向一块内存,其内容时所指内存的地址,引用是某块内存的别名。不同点指针存放变量地址的一个变量,在逻辑上是独立的...原创 2018-07-01 13:36:51 · 215 阅读 · 0 评论 -
指针和数组是否表示同一概念 C++
指针可以随时指向任意类型的内存块数组可以在静态存储区被创建联系指针可以方便的访问数组或者模拟数组区别修改内容不同:数组可以通过取下标的方式对其元素值进行修改,而指针是能用偏移的方式进行元素修改所占字节数不同:C/C++无法知道指针所指的内存容量,除非在申请内存时标记出来。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针...原创 2018-07-01 13:42:02 · 111 阅读 · 0 评论