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方法后面的默认参数,只是感觉到很纳闷,看答案才发现玄机。

摘录答案如下

ContractedBlock.gif ExpandedBlockStart.gif 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 .从编译上看:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。

转载于:https://www.cnblogs.com/westfly/archive/2011/02/24/1964088.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值