|
|
|
|
移动端

1.16.1 概念(2)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍概念。

作者:猿媛之家来源:机械工业出版社|2017-12-06 18:40

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


1.16.1  概念(2)

3)多态是指同一个实体同时具有多种形式,它主要体现在类的继承体系中,它是将父对象设置成为和一个或更多的它的子对象相等的技术,赋值以后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简而言之,就是允许将子类类型的指针赋值给父类类型的指针,在运行时根据实际的类型来决定调用哪个类的方法。

C++语言中的虚函数的作用主要是实现多态。多态技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,指的是试图使用不变的代码来实现可变的算法。例如模板技术、 RTTI(Run-Time Type Information,运行时类型信息)技术和虚函数技术,要么是试图做到在编译时决议,要

么试图做到运行时决议。面向对象包括以下六个基本原则(迪米特原则通常很少提及,所以,经常说的是五个基本原则):

1)单一职责原则(

Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化的原因。单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而大大损伤其内聚性和耦合度。通常意义下的单一职责,就是指只有一种单一功能,不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。

2)开放封闭原则(

Open-Closed Principle):软件实体应该是可扩展的,而不可修改的。也就是说,在设计中,应该允许行为被扩展,而无须修改现有的代码。实现开放封闭原则的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以,修改就是封闭的;而通过面向对象的继承和多态机制,又可以实现对抽象类的继承,通过重写其方法来改变固有行为,实现新的拓展方法,所以,就是开放的。

3)里式代换原则(

Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有当子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。里式代换原则是关于继承机制的设计原则,违反了里式代换原则就必然导致违反开放封闭原则。

4)依赖倒置原则(

Dependecy-Inversion Principle):依赖于抽象。具体而言,指的就是高层模块不依赖于底层模块,二者都同时依赖于抽象;抽象不依赖于具体,具体依赖于抽象。

5)接口隔离原则(

Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口。接口应该是内聚的,应该避免“胖”接口。一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染。

6)迪米特原则( Law of Demeter):对象与对象之间应该使用尽可能少的方法来关联,避免千丝万

缕的关系。迪米特法则的主要目的是控制信息的过载。

【真题 238】在 C++语言中,下面描述中,正确的是()。

A.如果一个基类的声明中有纯虚函数,那么该基类的派生类一定不再是抽象类

B.函数返回值类型不能作为重载函数调用的依据

C.静态数据成员不是所有对象所公有的

D.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方答案:B。对于选项 A,如果一个类中声明了一个纯虚函数,而其派生类中却没有对该函数进行定义,那么该

函数在其派生类中仍然是纯虚函数,而所有包含纯虚函数的类都是抽象类。所以,选项 A错误。

对于选项 B,所谓重载函数是指同一个函数名可以对应多个函数的实现,编译器会根据参数个数、参数类型和函数返回值类型不同而自动调用相应的函数,而无法用返回值来区分。所以,选项 B正确。

对于选项 C,类的静态成员是属于类的,而不是属于哪个对象的,可以说是所有对象所共有的。在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。所以,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。所以,选项 C错误。

对于选项 D,内联函数在编译时将该函数的目标代码插入每个调用该函数的地方。内联函数用 inline修饰,用于取代 C/C++语言中的宏定义。 inline是个建议机制而不是强制机制,这也意味着程序员可以指定任意函数为 inline函数,但是编译器会根据实际情况来决定是否将其 inline处理。对于代码量较大的函数,编译器往往会取消其 inline特性。 inline函数的特点之一就是执行速度快,它的实质是在编译时将函数的目标代码插入到每个调用该函数的地方,从而没有出栈入栈、保护现场等开销,提高了效率。在类体内定义的成员函数,自动被编译器当作内联函数处理,在类体外定义的成员函数,如果用 inline

修饰,编译器也认为是一种内联建议。所以,选项 D错误。

【真题 239】关键字 extern的作用是()。

A.声明外部链接 B.声明外部头文件引用

C.声明使用扩展 C++语句 D.声明外部成员函数、成员数据答案:D。关键字 extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇

到此变量和函数时在其他模块中寻找其定义。另外,关键字 extern也可用来进行链接指定。所以,选项 D正确。

【真题 240】结构化程序设计的基本原则包括()。

A.多态性 B.自顶向下 C.模块化 D.逐步求精答案:B、C、D。结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各

模块之间的关系尽可能简单,在功能上相对独立;每一个模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的系统任务分解成许多易于控制和处理的子任务,便于开发和维护。

所以,结构化程序设计方法的主要原则可以概括为:自顶向下,逐步求精,模块化和限制使用 GOTO语句,其中不包括多元性。所以,选项 B、选项 C和选项 D正确。

【真题 241】下面关于类和对象的描述中,错误的是()。

A.类就是 C语言中的结构体类型,对象就是 C语言中的结构体变量

B.类和对象之间的关系是抽象和具体的关系

C.对象是类的实例,一个对象必须属于一个已知的类

D.类是具有共同行为的若干对象的统一描述体

答案:A。

【真题 242】类的静态成员和非静态成员有什么区别?

答案:类的静态成员每个类只有一个,所有对象共享,非静态成员每个对象一个。

【真题 243】下面关于一个类的静态成员描述中,不正确的是()。

A.静态成员变量可被该类的所有方法访问 B.该类的静态方法只能访问该类的静态成员函数

C.该类的静态数据成员变量的值不可修改 D.子类可以访问父类的静态成员

E、静态成员无多态特性

答案:C。

【真题 244】下面选项中, B不能隐式转换为 A的是()。

A.class B:public A{} B.class A:public B{}

C.class B{operator A();} D.class A{A(const B&);}答案:B。对于选项 A,类 B公有继承自类 A,因此,类 B能隐式转换为类 A。所以,选项 A正确。对于选项 B,类 B是类 A的父类,子类包含了父类部分,子类可以转换为父类,但父类没有子类额

外定义的部分,是不能隐式转换成子类的。所以,选项 B错误。对于选项 C,C++中 operator有两个作用:运算符重载和类型转换函数。下面主要介绍类型转换函数,它有如下几个特点:

①函数定义在类中。

②用 operator来修饰,被修饰的函数名为待转换的目弊钹型。

③函数没有参数和返回值,但是函数体内有 return语句。 class B{operator A();}就是一个转换函数,用来把 B类型的对象转换为 A类型的对象,所以,选项 C

正确。对于选项 D,类 A实现了参数为 B的构造函数, B能隐式转换为 A。所以,选项 D正确。

因此,本题的答案为 B。

【真题 245】下列说法错误的有( )。

A.在类函数中可用 this来调用本类的类函数  B.在类方法中调用本类的类方法时可直接调用

C.在类函数中只能调用本类中的类函数  D.在类方法中绝对不能调用实例函数

答案:A、C、D。

对于选项 A,由于静态函数中没有 this指针,需要通过类名 .类函数来调用类函数。所以,选项 A

错误。对于选项 B,描述正确。对于选项 C,如果是子类,则子类的类函数中可以调用父类的类函数。所以,选项 C错误。对于选项 D,在静态函数中可以通过实例化一个对象,然后调用对象的方法。所以,选项 D错误。

【真题 246】在 C++语言中,以下描述不正确的是()。

A.接口中可以用虚函数 B.一个类可以实现多个接口

C.接口不能被实例化 D.接口中可以包含已经实现的函数答案:A、D。接口指的是只包含纯虚函数的抽象类,和普通的抽象类不一样。对于选项 A,接口必须是纯虚函数。所以,选项 A错误。对于选项 B,描述正确。对于选项 C,由于接口是特殊的抽象类,而抽象类的唯一作用就是创建派生类,不能定义抽象类的

对象。所以,选项 C是正确的。对于选项 D,接口即只包含纯虚函数的抽象类。所以,选项 D错误。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Reversing:逆向工程揭密

本书描述的是在逆向与反逆向之间展开的一场旷日持久的拉锯战。作者Eldad Eilam以一个解说人的身份为我们详尽地评述了双方使用的每一招每一...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊