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






  • 相关阅读:
    java TreeSet的排序之定制排序
    java TreeSet的排序之自然排序
    java TreeSet
    java Set接口(元素不可以重复)
    poj 3735 Training little cats(构造矩阵)
    进程创建/退出父子关系的调整
    安装R语言的包的方法
    项目搭建之路(上)
    为什么百度首页的HTML源代码最后一行要多一行?浪费空间呀!
    机器学习之梯度下降法
  • 原文地址:https://www.cnblogs.com/shuaigezhaoguang/p/5869759.html
Copyright © 2011-2022 走看看