条項37:継承されたデフォルトのパラメータ値を再定義しない

2333 ワード

この条項を開始する前に、C++のデフォルトパラメータに関する知識点を見てみましょう.
関数の宣言と定義を同時に行う場合
#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