《2022年程序员面试宝典+读书笔记 .pdf》由会员分享,可在线阅读,更多相关《2022年程序员面试宝典+读书笔记 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、程序员面试宝典(第十章面向对象)1.面向技术的基本概念对象,类和继承2.C+的空类默认产生哪些类成员?默认构造函数,析构函数,拷贝构造函数和赋值函数。3.Structure 是否可以拥有constructor 和 destructor 及成员函数?如果可以,structure 和 class还有什么区别?区别是 class 中变量默认是private,struct 中的变量默认是public。Struct 可以有构造,析构函数及继承。C+中的 struct 和 class 其实意义是一样的,struct 关键字的唯一意义就是为了让 C+编译器兼容以前用C 开发的项目。4.哪一种成员变量可以在同
2、一个类的实例之间共享?静态成员变量。如果想限制对静态成员变量的访问,则必须把它们声明为保护型或者私有型。如果把静态成员数据设为私有,可以通过公有静态成员函数访问。5.Class A Const int size=0;=A()Const int size=0;or static const int size=0;常量必须在构造函数的初始化列表里面初始化或者设置成静态变量。6.析构函数可以是内联函数吗?可以。#inlcude Using namespace std;Class A Public:Void foo()coutA;A();Inline A:A()cout foo();Delete ni
3、u;Return 0;7.MFC 类库中,CObject 的析构函数是虚拟的,有必要吗?Class CBase 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 11 页 -Public:CBase();.;Class CChild:public CBase Public:CChild();.;Main()CBase*pBase;CChild c;*pBase=&c;如果 CChild 类的构造函数在堆中分配了内存,而其析构函数又不是virtual 型的,那么撤销 pBase 时就不会调用CChild 的析构函数,从而不会释放其占据的内存空间,造成内存泄漏。8.析构函数可以为vir
4、tual 型,构造韩式则不能,为什么?虚函数采用虚调用的方法。虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是要创建一个对象,是必要知道对象的准确类型,因此构造函数不能为虚。9.如果虚函数非常有效,我们是否可以把每个函数都声明为虚函数?不行,虚函数是有代价的,每个虚函数对象都需维护一个V 表,因此在使用虚函数的时候都会产生一个系统开销。如果仅是一个很小的类,且不想派生其他类,那么没有必要使用虚函数。10.编写 String 类的构造函数,析构函数和赋值函数。Class String Public:String(const cha
5、r*str=NULL);/普通构造函数String(const String&other)/拷贝构造函数 String(void);/析构函数String&operate=(const String&other);/赋值函数Private:Char*m_data;/用于保存字符串 析构函数:String:String(void)delete m_data;/or delete m_data;构造函数:名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 11 页 -String:String(const char*str=NULL)if(str=NULL)M_data=new char
6、1;*m_data=0;Else int length=strlen(str);M_data=new charlength+1;Strcpy(m_data,str);拷贝构造函数:String:String(const String&other)Int length=strlen(other.m_data);M_data=new charlength+1;Strcpy(m_datat,other.m_data);赋值函数:String&String:opertate=(const String&other)If(this=&other)/检查自赋值Return*this;Delete m_da
7、ta;/释放原有的内存资源/分配新的内存资源,并复制内容Int length=strlen(other.m_data);M_data=new charlength+1;Strcpy(m_datat,other.m_data);Return*this;/返回本对象的引用 11.多态。虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法成为override。Override 是指子类重新定义父类的虚函数的做法,而overload 是指允许存在多个同名函数,而这些函数的参数表不同,overload 在编译期间就已确定是,是静态 的,故其和多态无关。而override,当子类重新定
8、义了父类的虚函数后,父类指针根据赋给它的不同子类指针,动态 地调用属于子类的该函数,函数地址是在运行期间绑定的。多态是为了实现接口重用。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 11 页 -程序员面试宝典(第十一章继承与接口)1.输出结果?#include Using namespace std;Class A Public:Void virtual f()cout Aendl;Class B:public A Public:Void virtual f()cout f();/输出为 A B*pb=(B*)pa;/转化 pa 为 B 类型并新建一个指针pb,将 pa 复制到
9、 pb,pb 也指向 pa 的f 函数Pb-f();/输出为 A Delete pa,pb;/删除了 pa,pb 的所指向的地址,但pa,pb 指针并没有删除,悬浮指针Pa=new B();/pa 指针的类型是A,现在重新给pa指向新地址,所指向的位置是B 类的Pa-f();/所以产生一个覆盖,输出 B Pb=(B*)pa;/转化 pa为 B 类指针给pb 赋值,pa所指向的f 函数是 B 类的 f 函数,所以 pb 也指向 B 类的 f 函数Pb-f();/输出 B 2.派生类的3 种继承方式。公有继承,私有继承,保护继承。Public:派生类的对象可以访问基类中的公有成员,派生类的成员可以
10、访问基类的公有成员和保护成员。Private:基类成员对于派生类对象的可见性,基类的所有成员都是不可见的。在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。(C+默认的是私有继承)Protected:同上,基类的公有成员和保护成员都作为派生类的保护成员,并且不能被这个派生类的子类所访问。3.虚继承Virtual 告诉编译器它不应当完成早绑定,相反,他应当自动安装实现晚绑定所必需的所有机制。编译器对每个包含虚函数的类创建一个表(称为vtable)。在 vtable 中编译器放置特定类的虚函数地址,在每个带有虚函数的类中,编译器秘密地放置一指针,称为vptr,指向这个对象的vtabl
11、e。通过基类指针做虚函数调用时,编译器静态的插入取得这个vptr,并在名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 11 页 -vtable 表中查找函数地址的代码,这样就能调用正确的函数使晚绑定发生。4.什么是虚继承?它与一般的继承有什么不同?虚拟继承是多重继承中特有的概念,为解决多重继承而出现的。Class A;Class B:public virtual A;Class C:public virtual A;Class D:public B,public C;5.多重继承的优缺点?多重继承本身没有神恶魔问题,如果运用得当可以事半功倍。不过多数系统的类层次往往有一个公共的基
12、类(如 C#中的 Object)。这样的结构如果使用多重继承,将会出现菱形继承,会使得类的访问结果相当复杂。但可以使用virtual 继承和 LOKI 库中的多继承框架来掩盖这些复杂性。6.如果鸟是可以飞的,那么鸵鸟不是鸟类吗?鸵鸟怎么继承鸟类?如果一定要鸵鸟继承鸟类,可以采用组合的办法,把鸟类中可以被鸵鸟继承的函数挑选出来。#include#include Using namespace std;Class bird Public:Void eat();Void sleep();Void fly();Class ostrich Public:Bird eat()cout ostrich ea
13、t;Bird sleep()cout D,D-M。则关系至多满足2NF 1NF:如果关系模式R 的所有属性的值域中的每个值都是不可在分解的值,则称R 属于第一范式。第一范式要求属性值不可再分裂成更小的部分,即属性项不能是属性组合或由属性组成。2NF:如果 R 为第一范式,并且R 中的每个非主属性完全函数依赖于R 的某个候选键,则称 R 为第二范式。3NF:如果 R 是第二范式,且每个非主属性都不传递依赖于R 的候选键,则称R 为第三范式。BCNF:如果 R 是第一范式,且每个属性都不传递依赖于R 的候选键,那么称 R 为 BCNF的模式。2.存储过程和函数的区别?存储过程是用定义一系列的SQL
14、 语句的集合,涉及特定表或者其他对象的任务,用户可以调用存储过程。而函数是数据库已定义的的方法,它接受参数并返回某种类型的值,并且不涉及特定用户表。3.事务?事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须有4 个属性,称为ACID(原子性,一致性,隔离性和持久性)。4.游标的作用?游标用于定位结果集的行。通过判断全局变量FETCH_STATUS可以判断是否到了行尾。通常此变量不等于0 表示出错或者是到了行尾。5.触发器分为事前触发和事后触发,这两种出发的区别?语句级触发和行级触发的区别?事前触发器运行于触发事件之前,而事后触发器运行于触发事件之后。语句级触发器可以在语句执行前或者
15、后执行,而行级触发器在触发器所影响的每一行触发一次。6.什么叫 SQL 注入式攻击?如何防范?就是攻击者把SQL 命令插入到Web 表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL 命令。在某些表单中,用户输入的内容直接用来构造动态SQL 命令,或者作为存储过程的输入参数,这类表单特别容易受到SQL 注入式攻击。防范 SQL 注入:1.替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL 命令的含义。2.删除用户输入内容中的所有连字符,防止攻击者顺利获得访问权限。3.对于用来查询的数据库账户,限制其权限。4.用存储过程来执行所有的查询。SQL 参数的传递方式
16、将防止攻击者利用单引号和连字符实施攻击。5.检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行。6.将用户登录名和密码等数据加密保存。7.检查提取数据的查询做返回的记录数量。如果程序要求返回一个记录,但实际返回的名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 11 页 -记录超过一行,那就当错误处理。7.找出表 ppp 里面 num 最小的数,不能使用min 函数。Select top 1 num from ppp order by num;Select*from ppp where num 1);9.写出复制表,拷贝表和四表联查的SQL
17、语句。复制表:(只复制结构)Select*into B from A where 1=0;拷贝表:(复制数据)Select*into B from A;10.如果用 SQL 创建一张临时表?Create table#Temp(.)临时表名前加#11.为了防止在查询记录时被其他用户更改记录,采用什么方法?添加一个时间戳类型的字段,timestamp 这种类型的数据会根据当前的时间自动产生一个时间字符串,确保这些数在数据库中是唯一的。Timestamp 一般用作给表行加版本戳的机制,存储大小为8 字节。一个表只能够有一个timestamp 列。每次插入或更新包含timestamp 列的行时,tim
18、estamp 列中的值均会更新。12.有个数据库只有一张表T,包含 1000 条记录,取第五到第七行的数据。Select top 3 userid from T where userid not in(select top 4 userid from T order by userid)order by userid;Select top 7 userid from T where userid ANY(select top 4 userid from T order by userid)Order by userid;Select top 7 userid from T where user
19、id ALL(select top 4 userid from T order by userid)Order by userid;13.要从字符串 Hello World 中提取 ello world Select lower(trim(H from Hello World)from dual;14.DML(数据操纵语言)的执行状态update 和 delete 15.Select 语句中的字符串连接符的符号是+16.什么是聚集索引?什么是非聚集索引?什么是主键?表中经常有一个列或列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键。聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,由于聚集索引规定数据在表中的物理存储顺序,所以一个表只能包含一个聚集索引。但该索引可以包含多个名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 11 页 -列。非聚集索引与课本中的索引类似,数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种方式存储(聚集索引)。名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 11 页 -
限制150内