c++几个面试题

来源:互联网 发布:mac如何打开exe 编辑:程序博客网 时间:2024/04/30 20:18

题目一:

static和const都可以修饰一个类的成员函数,请问:能不能同时用static和const修饰类的成员函数? 

温馨提示:

const的位置是在函数后边,修饰一个类的成员函数是写在函数的最后,而不是前边。前边的只是限制了返回值类型。

分析:答案是不能的。C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时static的用法和static是冲突的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。

题目二:

运行下面代码,输出的结果是:

A.h

class A{private:    int m;public:    A(int a)    {        m=a;    }    void print1()    {        printf("Hello world");    }    void  print2()    {        printf("%d",m);    }};
main函数

int main(int argc, const char * argv[]) {    A* P=NULL;    P->print1();    P->print2();    return 0;}

运行结果会崩溃。

分析:答案是print1调用正常,打印出Hello world,但运行至print2时,程序崩溃。调用print1时,并不需要P的地址,因为print1的函数地址是固定的。编译器会给print1传入一个this指针,该指针为NULL,但在print1中该this指针并没有用到。只要程序运行时没有访问不该访问的内存就不会出错,因此运行正常。在运行print2时,需要this指针才能得到m_value的值。由于此时this指针为NULL,因此程序崩溃了。

题目三:

运行下面代码,输出的结果是:

class A{private:    int m;public:    A(int a)    {        m=a;    }    void print1()    {        printf("Hello world");    }    virtual void  print2()    {        printf("%d",m);    }};
main函数

int main(int argc, const char * argv[]) {    A* P=NULL;    P->print1();    P->print2();    return 0;}

程序崩溃

分析:print1就不用多说,和上边的一样。当调用虚函数print2的时候,要根据实例(即this指针指向的实例)中虚函数表指针得到虚函数表,再从虚函数表中找到函数的地址。由于这一步需要访问实例的地址(即this指针),而此时this指针为空指针,因此导致内存访问出错。






0 0