今天面试时被问到两个问题,记录如下。
1. C++语言中,int test(int iVal) 这样的函数定义有没有问题
偶回答没有问题,面试官说应该写为int test(const int& iVal),偶跟他争论说传值没有效率影响,他说这是公司代码规定。
偶于是就有几个问题了,传值和传引用代表着两种语义,在不同情况下应该有不同的应用,为何要这样硬性规定呢。为什么.NET里要设计值类型和引用类型?为什么STL和大量的C++库中int, size_t, char这样的类型都是直接传值呢。偶有一些观点,但也不知是否正确,先拿出来请大家共议一下了。况且如果是公司规定要const &,偶说这个函数定义没问题,也不为过吧。
而且似乎现在无论C++还是C#,都不会推荐在iVal中加入那么一个类型前缀吧。
2. int i32 = 10; object o = i32; Int64 i64 = (Int64)o;
面试官在写的时候,偶回答说是box和unbox。他说偶回答对了一半,接着问我这样写有没有问题,偶说有啊,类型不匹配,会出异常。面试官又说如果Int32实现了IConvertible呢,偶说还是有问题,于是面试官很有自信的说,你回去自己试试看吧。
面试官的要求偶哪敢不听,于是回到家马上开了VS 2005,结果运行一看,Invalid Cast。装箱后的object保存了原有数据的类型,在拆箱时会对类型进行检查。box和unbox各对应MSIL中的一条语句,为了保持效率,是不会在这个过程中考虑IConvertible的,在运行时用Reflection去检查对象是否实现某接口的代码有点高了吧。
由此,给要去接受面试的朋友一些建议吧,自己认为对的,就一定要坚持。在面试别人的时候,也不用一定要把对方难住,况且术业有专攻,难倒了面试者,就能说明什么问题吗?