GEEK学习笔记— —程序员面试宝典笔记(四)

GEEK学习笔记— —程序员面试宝典笔记(四)所谓笔记,就是比较个人的东西,把个人觉得有点意思的东西记录下来~~程序员面试宝典笔记(一)基本概念程序员面试宝典笔记(二)预处理、const和sizeof程序员面试宝典笔记(三)auto_ptr、递归程序员面试宝典笔记(四)面向对象、类型转换、static

大家好,欢迎来到IT知识分享网。

所谓笔记,就是比较个人的东西,把个人觉得有点意思的东西记录下来~~

程序员面试宝典笔记(一)基本概念
程序员面试宝典笔记(二)预处理、const和sizeof
程序员面试宝典笔记(三)auto_ptr、递归
程序员面试宝典笔记(四)面向对象、类型转换、static
程序员面试宝典笔记(五)数据结构基础
程序员面试宝典笔记(六)软件测试

题目

哪一种成员变量可以在同一个类的实例之间共享?

答案

必须使用静态成员变量在一个类的所有实例间共享数据。如果想限制对静态成员变量的访问,则必须把它们声明为保护型或私有型。不允许用静态成员变量去存放某一个对象的数据。静态成员数据是在这个类的所有对象间共享的。

题目

重载和覆盖有什么不同?

答案

虚函数总是在派生类中被改写,这种改写被称为“override”(覆盖)。override是指派生类重写基类的虚函数,重写的函数必须有一致的参数表和返回值(C++标准允许返回值不同的情况,但是很少
有编译器支持这个特性)。
overload约定成俗地被翻译为“重载”,是指编写一个与已有函数同名但是参数表不同的函数。例如一个函数既可以接收整型数作为参数,也可以接收浮点数作为参数。重载不是一种面向对象的编程,而只是一种语法规则,重载与多态没有什么直接关系。

题目

派生类的继承方式

答案

派生类有3种继承方式:公有继承(publ ic)、私有继承(private)和保护继承(protected)。

1.公有继承方式
基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。这里保护成员与私有成员相同。

基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见,基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态;基类的私有成员不可见,基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。

基类成员对派生类对象的可见性对派生类对象来说,基类的公有成员是可见的,其他成员是不可见的。

所以,在公有继承时,派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的公有成员和保护成员。

2.私有继承方式
基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。

基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的,基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的,派生类不可访问基类中的私有成员。

基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。

所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

3.保护继承方式
这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。

基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的,基类的公有成员和保护成员都作为派生类的保护成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的,派生类不可访问基类中的私有成员。

基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。

所以,在保护继承时,基类的成员也只能由直接派生类访问,而无法再往下继承。

题目

c++中的类型转换

答案

C 风格(C-style)强制转型如下:
(T) expression 或 T(expression)
两种形式之间没有本质上的不同。

对于具有转换的简单类型而言C 风格转型工作得很好。然而,这样的转换符也能不分皂白地应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:reinterpret_cast, static_cast, dynamic_cast和const_cast,目的在于控制类(class)之间的类型转换。

reinpreter_cast
用法:reinpreter_cast (expression)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。

这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。reinpreter_cast是特意用于底层的强制转型,导致实现依赖(就是说,不可移植)的结果。

const_cast
用法:const_cast (expression)

用于修改类型的const或volatile属性。除了const 或volatile修饰之外,type_id和expression的类型是一样的,一般用于强制消除对象的常量性。它是唯一能做到这一点的 C++ 风格的强制转型,而C不提供消除const的机制。

常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

static_cast
用法:static_cast < type-id > ( expression )

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它允许执行任意的隐式转换和相反转换动作。主要有如下几种用法:
1)用于基本数据类型之间的转换,如把int转换成char,non-const 对象转型为 const 对象(这里相反方向不可以,C++只有const_cast可以)。
2)把空指针转换成目标类型的指针。(之前的做法是用强制转换(type-id*))
3)把任何类型的表达式转换成void类型。
4)应用到类的指针上,它允许子类类型的指针转换为父类类型的指针(upercasting这是一个有效的隐式转换);也能够执行相反动作,即转换父类为它的子类(downcasting),这种转换的安全性需要开发人员来保证(主要是在非上下转型中)。

注意:
1.static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
2.在非基本类型或上下转型中,被转换的父类需要检查是否与目的类型相一致,否则,如果在两个完全不相干的类之间进行转换,将会导致编译出错。

dynamic_cast
只用于对象的指针和引用,主要用于执行“安全的向下转型”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风格语法执行的强制转型,也是唯一可能有重大运行时代价的强制转型。

当用于多态类型时(包含虚函数),它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(即隐式转换的相反过程),dynamic_cast根据RTTI信息检查操作是否有效。即在转换时dynamic_cast会检查转换是否能返回一个被请求的有效的完整对象。这种检查不是语法上的,而是真实情况的检查。检测在运行时进行,如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。

先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息的,这也就意味着,如果基类没有虚函数,也就无法判断一个基类指针变量所指对象的真实类型, 这时候dynamic_cast只能用来做安全的转换(upercasting),如从派生类指针转换成基类指针,而这种转换其实并不需要dynamic_cast参与。

题目

关键字static的作用是什么?

答案

● 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分
配一次,因此其值在下次调用时仍维持上次的值。
● 在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其他函数访
问。
● 在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限
制在声明它的模块内。
● 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。
● 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问
类的static成员变量。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10901.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信