条項37:継承されたデフォルトのパラメータ値を再定義しない
2333 ワード
この条項を開始する前に、C++のデフォルトパラメータに関する知識点を見てみましょう.
関数の宣言と定義を同時に行う場合
これでは文法、コンパイルエラーはありません.
ただし、宣言と定義が分かれている場合は、次のようになります.
コンパイルエラーが発生します.
これは、宣言が関数アドレスのエントリであり、宣言で実パラメータが入力され、デフォルトパラメータがあり、対応する実パラメータが指定されていない場合は、デフォルトパラメータが実パラメータとして入力され、関数定義のアドレスが検索されるためです.だから関数定義に着いたらデフォルトパラメータはもうありません.これは私の理解です.
http://www.cnblogs.com/zhengyuhong/p/3485792.html
http://m.blog.csdn.net/blog/zh01085105/19414075
http://blog.csdn.net/hw_henry2008/article/details/6439128
http://www.cnblogs.com/zhoug2020/archive/2012/05/23/2514215.html
関数の宣言と定義を同時に行う場合
#include <iostream>
#include <cmath>
using namespace std;
double dis(double x,double y,double a = 0, double b = 0)
{
return sqrt((x-a)*(x-a)+(y-b)*(y-b));
}
int main()
{
cout<<dis(3,4);
return 0;
}
これでは文法、コンパイルエラーはありません.
ただし、宣言と定義が分かれている場合は、次のようになります.
#include <iostream>
#include <cmath>
using namespace std;
double dis(double x,double y,double a = 0, double b = 0);
int main()
{
cout<<dis(3,4);
return 0;
}
double dis(double x,double y,double a = 0, double b = 0)
{
return sqrt((x-a)*(x-a)+(y-b)*(y-b));
}
コンパイルエラーが発生します.
1>e:\vs2012\test\test\main.cpp(11): error C2572: “dis”: : 4
1> e:\vs2012\test\test\main.cpp(4) : “dis”
1>e:\vs2012\test\test\main.cpp(11): error C2572: “dis”: : 3
1> e:\vs2012\test\test\main.cpp(4) : “dis”
これは、宣言が関数アドレスのエントリであり、宣言で実パラメータが入力され、デフォルトパラメータがあり、対応する実パラメータが指定されていない場合は、デフォルトパラメータが実パラメータとして入力され、関数定義のアドレスが検索されるためです.だから関数定義に着いたらデフォルトパラメータはもうありません.これは私の理解です.
#include <iostream>
#include <cmath>
using namespace std;
double dis(double x,double y,double a = 0, double b = 0);
int main()
{
cout<<dis(3,4);
return 0;
}
double dis(double x,double y,double a, double b)
{
return sqrt((x-a)*(x-a)+(y-b)*(y-b));
}
http://www.cnblogs.com/zhengyuhong/p/3485792.html
http://m.blog.csdn.net/blog/zh01085105/19414075
http://blog.csdn.net/hw_henry2008/article/details/6439128
http://www.cnblogs.com/zhoug2020/archive/2012/05/23/2514215.html