zoukankan      html  css  js  c++  java
  • C++面试每日一题之16

    原题为 C++#面试每日一题#(16):运行下图中代码,输出的结果是什么?

    代码如下

    #include <iostream>
    using namespace std;
    struct A
    {
    virtual void print(int super = 10)
    {
    cout
    <<"std : from A "<<super <<endl;
    }
    };

    struct B:public A
    {
    virtual void print(int super = 20)
    {
    cout
    <<"std : from B "<<super <<endl;
    }
    };
    int main()
    {
    B b;
    A
    &a = b;
    a.print();
    return 0;
    }

    输出结果为
    std : from B 10

    这题在微博上已经有解释,我看到此题的时候没有怎么注意到 print方法后面的默认参数,只是感觉到很纳闷,看答案才发现玄机。

    摘录答案如下

    View Code
    答案:输出B::Fun with number 10
    由于a是一个指向B实例的引用,因此在运行的时候会调用B::Fun。但缺省参数是在编译期决定的。
    在编译的时候,编译器只知道a是一个类型a的引用,具体指向什么类型在编译期是不能确定的,
    因此会按照A::Fun的声明把缺省参数number设为10。
    这一题的关键在于理解确定缺省参数的值是在编译的时候,但确定引用、指针的虚函数调用哪个类型的函数是在运行的时候。

    根据回复说此类型的问题在《Effective C++》的Item 37有所讨论——“对于虚拟函数不要用默认的参数——静态”。

    可以验证,当代码为

    int main()
    {
    B b;
    A
    *a = &b;
    a
    ->print();
    return 0;
    }

    结果输出依然为
    std : from B 10

    指针与引用在此处的差别不大。

    PS: 记得当年有人面试问指针与引用的差别。我觉得最大的差别在于指针有空间,而引用只是一个别名,不占用空间。

    @2011.3.1日,评论指出该论点是错误的。Google了下,发现一篇2010年撰写的文章,颇有道理,详见《C++中的指针与引用》。

    下面的叙述也有待更新。

    此外Google到的结果是《指针和引用的区别总结

    原文如下

    1.从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变
    2.从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域
    3.从编译上看:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。
  • 相关阅读:
    HTML 嵌入 SWF ,访问域的问题
    Flex 4 中,StageScaleMode 设置
    一句话清除MC下所有的子
    DataGrid 表头标题,表格文字的字体设置
    Flash中,将某个元件置于最顶层
    Android开发中使用SQLite 数据库
    Android多分辨率支持说明
    Android adb shell 命令大全
    Android Camera 使用小结
    Android多分辨率支持以及各种类型图标尺寸大小
  • 原文地址:https://www.cnblogs.com/westfly/p/1964088.html
Copyright © 2011-2022 走看看