c++面试问题的几个方向

1 关于多态,面向对象的几个要点
作为面向对象的程序员,这个问题是必须要弄清楚的,网上、教科书上都是标准答案,关键是理解内涵哦。

2 关于虚函数表和RTTI
这个Inside C++ Object Model讲的相当明确
虚函数表的第一项就是关于RTTI的,RTTI就是Run Time Type Identification。
后面就是虚函数指针项了。
 
3 C++对象的内存布局
在引入了虚函数、继承、多继承、虚拟继承后,再加上内存对齐,这个问题就不那么简单了。
 
4 构造函数、析构函数与虚函数
一系列问题,作为一个C++程序员,这个务必要搞清楚。
 
5 虚函数的缺省参数问题
代码估计更能描述清楚问题:
class A
{
public:
    virtual void function(int type = 0) {...}   
}
 
class B : public A
{
public:
    virtual void function(int type = 2) {...} // 注意这里type缺省值被改成了2
}
这样改有什么问题呢?
我们知道virtual是动态绑定的,为了效率考虑,缺省参数是静态绑定的,使用的是基类的缺省参数。这样一来上面的做法就会出现问题了。
如果能使用静态绑定和动态绑定来解释这个问题,那你就上了一个台阶了,我是从来没这样用过啊,不知道问题所在。有文章说没有吃过苦头的C++程序员不是好程序员,驯服不了C++这个怪物,此言非虚!?
 
6 关于运算符
重载的问题,运算符和函数
 
7 关于new与delete的形式

 
8 关于private继承
不知道多少人用过,用了又能有多少好处,而且有些语言已经禁止private继承了,纠缠这个有何意义呢。
 
9 关于STL的Iterator
STL有很多牛思想,不过我还没被问过,像Traits编程技法等等。面试常见的是,++前置与后置的效率问题。

为了编译器区分前置和后置++,C++规定后置形式有一个int类型参数 ,当函数被调用时,编译器传递一个0做为int参数的值给该函数。不这样规定,无法区分,因为都仅以自身对象为入参

class  CInt  {
private:
    int  m_value;
    // 
    CInt  &  CInt:: operator ++ ()  //  前置的是没有参数的,并且返回引用 
    {
        this->m_value += 1;
        return   *this;
    }
    const  CInt CInt::operator++ (int)  //  后置的有一个匿名参数,并且返回const值 
    {
        CInt old = *this;
        ++(*this);
        return  old;
    }
};

上面的实现解释了一个关键问题:前置比后置效率高 ,后置需要构造临时对象并返回

为什么前置和后置返回参数不同呢

    前置仅仅是对自身进行运算,并将自身返回,这样外面可以直接对这个返回对象再进行操作 ,如(++it)->function()。

    后置因其返回的不是原来的对象,此时再进行额外操作,改变的是临时对象的状态,并不异义 ,容易误解。

    那为什么不返回const &呢?因为不能这么做,返回引用将无效,临时对象已经不存在了。

    所以后置返回const 对象即限制对此临时对象进行误操作,并显式地告诉调用者此对象仅为原对象的副本。


10 关于C++的异常
C++有异常处理机制,虽然不够完善,但还是应该去仔细了解了解。
 
11 关于C++与C的效率问题
      这个问题最不好讲,效率的比较,环境是什么,先决条件又是什么呢,从语言层面讲C++比起C语言来主要的效率损失来自于virtual导致的非直接调用,这个Inside C++ Object Model讲的相当明确了。

posted @ 2014-09-10 21:25  合唱团abc  阅读(363)  评论(0编辑  收藏  举报