Autodest第一电面试题 (一)

 
1、c到c++的四种类型转换(不是强制类型转换,强制类型转换会有问题)
       汗,我只知道强制类型转换。面试的何师兄人还多好的,指出有四种const_cast, dynamic_cast, reinterpret_cast, static_cast。后来完了查资料知道:
Static_cast  static_cast < type-id > ( expression )     
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类和子类之间指针或引用的转换。
  进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
  进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
可用于强制隐型转换(如,non-cast对象转型为const对象,int转型为double等),也于用很多这样的转换的反向转换(如,void*转型为有类型的指针,基类指针转型为派生类指针),但是不能将一个const转型为一个non-cast对象(只有const-cast能做到),它是最接近于C-style的转换。如
Int testNum;
       Static_cast<double> testNum;
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
 
Dynamic_cast 主要执行“安全的向下转型”,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风格语法执行的强制转型,也是唯一可能有重大运动时代价的强制转型。供了两种转换方式,把基类指针转换成派生类指针,或者把指向基类的左值转换成派生类的引用。
       Class A{…..}
       Class AB:public A{}
       Void Update(AB* xy);
       AB ab;
       A* pa = new AB;
       Update(dynamic_cast<AB*>pa);
Dynamic_cast 主要用于层次之间上行转换与下行转换,在类层次间进行上行转换时,dynamic_cast与static_cast的效果是一样的;进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast安全。不要尝试去用dynamic_cast改变表达式的常量性,也无法在缺乏虚函数的型别上使用(比如int to double转换,要用static_cast)
 
Const_cast 一般用于强制消除对象的常量性。它是唯一能做到这一点的C++风格的强制转型
Class A{…}
       Class AB:public A{}
       Void Update(AB* xy);
       AB ab;
       Const AB& cab = ab;
       Update(&cab);//这样是错误的
       Update( const_cast<AB* >(&cab) );//正确,去掉了常量性
 
 
 
Const_cast不支持带继承关系的转换
       A* pa = new AB;
       Update(const<AB*>pa);//这样是错误的
最重要的是,const_cast就是去除常量性。
 
Reinterpret_cast就是用于底层的强制转型,例如,将一个指针转型为一个整数,这样的强制转换在底层代码极为少见。type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
 
比较:
Class B{…};
Class D: public B{….};
Void f( B* pb)
{
       D* pd1 = dynamic_cast<D* >(pb);
       D* pd2 = static_cast<D* >(pb);
}如果pb已经指向一个类型D的对象,则pd1,pd2会取得相同的值,如果pb==0也会得到相同的值,并有对这两个指针执行D类型的任何操作都是安全的;如果pb指向一个B类型的对象,则pd1是一个指向该对象的指针,对它进行D类型的操作将是不安全的,而pd2将是一个空指针。
 
Dynamic_cast可于继承体系中向下转型,即将基类转换为子类指针,比static_castg更严格理安全,dynamic_cast效率比static_cast要差一些,但static_cast在更宽上范围内可以完成映射,这种不加限制的映射伴随着不安全性。Static_cast覆盖的变换类型层次的静态导航外,还包括无映射变换,用void* 的强制变换,隐式类型变换。
2、指针和引用的区别
指针是地址,引用是为变量起的别名,必须在定义时初始化,且初始化后不可变。“引用”作为函数参数的特点有:
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
3、static在c++与c中的用法与区别,(包括用在函数与变量前)
static在C++中三种用法,C中只有前两种用法
局部静态变量
外部静态变量
静态数据成员/成员函数
分别说明:
局部静态变量:数据分配在静态存储区,与全局变量一起,在所处模块运行之初初始化一次,且只操作一次,如果不赋值则为0或空字符。
外部静态变量/函数:在C中表示不能被其它文件访问的全局变量和函数,此时static不是指存储方式,而是指对函数的作用域仅限于本文件(又叫内部函数),对于外部(全局)变量,不论是否有static限制,它的存储区都在静态存储区,生存期都是全局的。使用内部函数的好处是,不同的编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
静态数据成员/成员函数:C++重用这个关键字,表示“属于一个类而不是属于此类的任何特定对象的变量和函数”,它对整个类来说是唯一的。普通成员函数调用时,要用this指针,但是static成员函数调用时,没有this指针,并且静态成员函数中用到的数据,必须是静态数据成员。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值