【No.12 C++参数传递方式造成的对象切割】
2011-12-04 16:45
190 查看
==【注意】==
程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度
本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家思考讨论,问题的解析将在下一更新贴中一并给出,这样做是希望还不清楚问题的朋友有自己思考和讨论的时间,希望大家能从这些帖子中有所收获。
贴中问题属我在学习C\C++过程中遇到的一些语法或者比较隐晦的程序问题,其中有自己的总结,也不乏网络上搜索到的经典解析,在此分享给大家,希望能起到抛砖引玉的作用
我已认真检查过自己的帖子,但难免有疏忽,如大家在阅读过程中仍发现有问题,请及时通知[/u],我会及时更正,以免误导大家,万分感谢^_^
[align=center]【No.12 C++ 参数传递方式导致的对象切割问题】
[/align][align=left]由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性,此贴仅供交流讨论本次问题,若大家对上一问题有任何疑问,请通过解答末尾的传送链接前往该问题贴回复讨论[/align][问题12]
请写出以下代码的执行结果并说明原因:
复制内容到剪贴板代码:
复制内容到剪贴板代码:
程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度
本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家思考讨论,问题的解析将在下一更新贴中一并给出,这样做是希望还不清楚问题的朋友有自己思考和讨论的时间,希望大家能从这些帖子中有所收获。
贴中问题属我在学习C\C++过程中遇到的一些语法或者比较隐晦的程序问题,其中有自己的总结,也不乏网络上搜索到的经典解析,在此分享给大家,希望能起到抛砖引玉的作用
我已认真检查过自己的帖子,但难免有疏忽,如大家在阅读过程中仍发现有问题,请及时通知[/u],我会及时更正,以免误导大家,万分感谢^_^
[align=center]【No.12 C++ 参数传递方式导致的对象切割问题】
[/align][align=left]由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性,此贴仅供交流讨论本次问题,若大家对上一问题有任何疑问,请通过解答末尾的传送链接前往该问题贴回复讨论[/align][问题12]
请写出以下代码的执行结果并说明原因:
复制内容到剪贴板代码:
#include<iostream> class Base { public: virtual void print(void) const { std::cout<<"Base::print()"<<std::endl; } }; class Derived : public Base { public: virtual void print(void) const { std::cout<<"Derived::print()"<<std::endl; } }; void passByValue(Base obj) { obj.print(); } void passByReferenceToConst(const Base& obj) { obj.print(); } int main(int argc, char **argv) { Derived derived; passByValue(derived); passByReferenceToConst(derived); return EXIT_SUCCESS; }[align=center]No.11 C+默认实参的匹配浅析[/align]问题浅析
复制内容到剪贴板代码:
/*** *解决本问题的关键在于记住以下准则: *① 我们可以为一个或多个形参指定默认实参 * 但是如果有一个形参被指定了默认实参, * 那么,该形参后的所有形参都必须指定 * 默认实参。 *② 函数调用的实参按位置对形参进行替换 * 默认实参只能用来替换函数调用中缺少 * 的尾部实参。 ************************************/ #include<iostream> using namespace std; void defaultArg(int a=24, int b=48, char c='c') { cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; cout<<endl; } int main(int argc, char **argv) { defaultArg(); //没有提供实参,因此本函数调用使用默认实 //参a=24,b=48,c='c' defaultArg(1); //有一个实参1,根据准则②,默认实参只能替换 //函数调用中缺少的尾部实参,所以a=1,b和c使用 //默认实参b=48,c='c' defaultArg(1,2); //同上,a=1,b=2,c='c' defaultArg( , ,'A'); //编译错误,默认实参只能用来替换函数调用中缺少 //的尾部实参,这里试图用默认实参a=24,b=48来替换 //本函数调用时缺少的实参,编译错误 defaultArg('c'); //有一个实参'c',根据准则②,因此本函数调用的实 //参为a='c',b和c使用的是实参b=48,c='c' return EXIT_SUCCESS; }本文出自 “Bill_Hoo专栏” 博客,请务必保留此出处http://billhoo.blog.51cto.com/2337751/733278
相关文章推荐
- 以引用的方式传递参数避免对象切割
- 第二周项目1-C/C++语言中函数参数传递的三种方式
- 第二周 项目1-C/C++语言中函数参数传递的三种方式
- 第二周——C/C++语言中函数参数传递的三种方式
- C++的函数的参数的传递方式
- c++参数传递方式,C语言可借鉴
- 第二周项目1-C/C++语言中函数参数传递的三种方式
- C++对象参数传递
- 【整理】--C++三种参数传递方式
- 第二周项目一-C/C++语言中函数参数传递的三种方式
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
- C++函数参数和返回值三种传递方式:值传递、指针传递和引用传递(着重理解)
- 第二周项目:C/C++函数参数传递的三种方式
- 第2周项目1--c/c++语言中函数参数传递的三种方式
- 第2周项目1-C/C++语言中函数参数传递的三种方式
- 第二周项目一 C/C++语言中函数参数传递的三种方式
- 基础篇之常用的C++参数传递的三种方式
- C++之把流对象当做函数参数传递
- 第二周项目1-C/C++语言中函数参数传递的三种方式
- 第二周项目1-C/C++语言中函数参数传递的三种方式