zoukankan      html  css  js  c++  java
  • c++几个面试题

    题目一:

    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指针为空指针,因此导致内存访问出错。






  • 相关阅读:
    401. Binary Watch
    46. Permutations
    61. Rotate List
    142. Linked List Cycle II
    86. Partition List
    234. Palindrome Linked List
    19. Remove Nth Node From End of List
    141. Linked List Cycle
    524. Longest Word in Dictionary through Deleting
    android ListView详解
  • 原文地址:https://www.cnblogs.com/shuaigezhaoguang/p/5869759.html
Copyright © 2011-2022 走看看