码迷,mamicode.com
首页 > 编程语言 > 详细

C++面试题(1-3)

时间:2015-03-30 23:18:07      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:

题(1)

运行下图中代码,输出的结果是什么?这段代码有什么问题?

<!-- lang: cpp -->
#include <iostream>
class A
{
    public:
        A()
        {
            std::cout << "A is created." << std::endl;
        }

        ~A()
        {
            std::cout << "A is deleted." << std::endl;
        }
};

class B : public A
{
    public:
        B()
        {
            std::cout << "B is created." << std::endl;
        }

        ~B()
        {
            std::cout << "B is deleted." << std::endl;
        }
};

 int _tmain(int argc, _TCHAR* argv[])
{
    A* pA = new B();
    delete pA;
    return 0;
}

答案:输出三行,分别是:A is created. B is created. A is deleted。

用new创建B时,回调用B的构造函数。在调用B的构造函数的时候,会先调用A的构造函数。因此先输出A is created. B is created.

接下来运行delete语句时,会调用析构函数。由于pA被声明成类型A的指针,同时基类A的析构函数没有标上virtual,因此只有A的析构函数被调用到,而不会调用B的析构函数。

由于pA实际上是指向一个B的实例的指针,但在析构的时候只调用了基类A的析构函数,却没有调用B的析构函数。这就会存在一个问题。如果在类型B中创建了一些资源,比如文件句柄、内存等,在这种情况下都得不到释放,从而导致资源泄漏。

建议定义析构函数为虚函数,这样可以避免使用不当导致资源不能释放。
PS:在构造函数中,虚函数会失去其动态绑定特性。

题(2)

我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量)。请问:能不能同时用static和const修饰类的成员函数?

答案:不可以。

C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时static的用法和static是冲突的。

我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。

题(3)

运行下图中的C++代码,输出是什么?

<!-- lang: cpp -->
#include <iostream>
class A
{
private:
    int n1;
    int n2;

public:
    A(): n2(0), n1(n2 + 2)
    {
    }

    void Print()
    {
            std::cout << "n1: " << n1 << ", n2: " << n2 << std::endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    a.Print();
    return 0;
}

答案:输出n1是一个随机的数字,n2为0。

在C++中,成员变量的初始化顺序与变量在类型中的申明顺序相同,而与它们在构造函数的初始化列表中的顺序无关。因此在这道题中,会首先初始化n1,而初始n1的参数n2还没有初始化,是一个随机值,因此n1就是一个随机值。初始化n2时,根据参数0对其初始化,故n2=0。

参考资料:

程序员面试题精选100题

C++面试题(1-3)

标签:

原文地址:http://my.oschina.net/hoolev/blog/393816

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!