天天看点

【No.11 默认实参的匹配】

==【注意】== 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度

本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家思考讨论,问题的解析将在下一更新贴中一并给出,这样做是希望还不清楚问题的朋友有自己思考和讨论的时间,希望大家能从这些帖子中有所收获。

贴中问题属我在学习C\C++过程中遇到的一些语法或者比较隐晦的程序问题,其中有自己的总结,也不乏网络上搜索到的经典解析,在此分享给大家,希望能起到抛砖引玉的作用

【No.11 C++默认实参的匹配顺序】

由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性,

[问题11]

请写出以下代码中能够通过编译的行的结果,并指出会发生编译错误的行并说明原因:

复制内容到剪贴板

<code>#include&lt;iostream&gt; using namespace std; void defaultArg(int a=24, int b=48, char c='c') {   cout&lt;&lt;"a = "&lt;&lt;a&lt;&lt;endl;   cout&lt;&lt;"b = "&lt;&lt;b&lt;&lt;endl;   cout&lt;&lt;"c = "&lt;&lt;c&lt;&lt;endl;   cout&lt;&lt;endl; } int main(int argc, char **argv) {   defaultArg();   defaultArg(1);   defaultArg(1,2);   defaultArg( , ,'A');   defaultArg('c');   return EXIT_SUCCESS; }</code>

问题浅析

<code>/*** *  解决此题的关键在于理解C++类成员变量 *  的初始化顺序。 *  C++类成员变量的初始化顺序并不是由构 *  造函数的初始化顺序决定,而是由变量在 *  类中的声明次序所决定 ***************************************/ #include&lt;iostream&gt; using namespace std; class Test {   public:     //注意,这两个构造函数都试图让你误以为     //首先初始化变量_j,然后才用已经初始化的     //_j去初始化变量_i     //而实际上,由于_i在类中首先被声明,因此     //初始化时一定是先初始化_i,然后才初始化j          //首先初始化_i=0,然后初始化_j=0     Test(void):_j(0), _i(0){}     //首先用_j初始化_i,但是此时_j并没有被初始化     //因此_j是一个随机值(而非k),所以_i被初始化     //为一个随机值,然后初始化_j=k     Test(int k):_j(k), _i(_j){}     void print(void)     {       cout&lt;&lt;"i = "&lt;&lt;_i&lt;&lt;endl           &lt;&lt;"j = "&lt;&lt;_j&lt;&lt;endl;     }   private:     int _i;     int _j; }; int main(int argc, char **argv) {   Test t(20);   t.print();  //由于_i是随机值xxx,所以输出为   //i = xxx   //j = 20   return EXIT_SUCCESS; }</code>

     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/733276,如需转载请自行联系原作者

继续阅读