==【注意】== 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度
【No.11 C++默认实参的匹配顺序】
由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性,
[问题11] 请写出以下代码中能够通过编译的行的结果,并指出会发生编译错误的行并说明原因: 复制内容到剪贴板
代码:
#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(); defaultArg(1); defaultArg(1,2); defaultArg( , ,'A'); defaultArg('c'); return EXIT_SUCCESS; }
浅析
问题浅析 复制内容到剪贴板
代码:
/*** * 解决此题的关键在于理解C++类成员变量 * 的初始化顺序。 * C++类成员变量的初始化顺序并不是由构 * 造函数的初始化顺序决定,而是由变量在 * 类中的声明次序所决定 ***************************************/ #include<iostream> 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<<"i = "<<_i<<endl <<"j = "<<_j<<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; }
本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/733276 ,如需转载请自行联系原作者