原题为 C++#面试每日一题#(16):运行下图中代码,输出的结果是什么?
2013-10-18 14:54
501 查看
代码如下
#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: 记得当年有人面试问指针与引用的差别。我觉得最大的差别在于指针有空间,而引用只是一个别名,不占用空间。此外Google到的结果是《指针和引用的区别总结 》
原文如下
1.从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变
2.从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域
3.从编译上看:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。
#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: 记得当年有人面试问指针与引用的差别。我觉得最大的差别在于指针有空间,而引用只是一个别名,不占用空间。此外Google到的结果是《指针和引用的区别总结 》
原文如下
1.从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变
2.从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域
3.从编译上看:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。
相关文章推荐
- vector向量练习小例子c++代码实例及运行结果
- struct使用继承c++代码实例及运行结果
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- Opencv检测交通中红色标识轮廓c++代码实例及运行结果
- 交通标识检测c++代码实例及运行结果
- c++代码批量修改图片名称(重命名)实例及运行结果
- 面试例题2:以下代码的运行结果是 。[Advantech2005年12月面试题]
- 八进制与十进制相互转换c++代码实例及运行结果
- 插入排序(正序、倒序)-c++代码实现及运行实例结果
- 查找-c++代码实现及运行实例结果
- 交通标识牌识别c++代码实例及运行结果
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 选择排序-c++代码实现及运行实例结果
- 双链表的建立,测长度,打印,插入c++代码实例及运行结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- memcpy内存拷贝函数的写法c++代码实例及运行结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 删除指定字符c++代码实例及运行结果
- strstr()函数c++代码实现实例及运行结果