ページ 11

C++のオーバーロードに関して

Posted: 2010年5月28日(金) 13:35
by skuld
はじめまして、skuldと申します
はじめての書きこみなので読みづらかったら申し訳ないです
先日「Cの絵本」を読み終えて、現在「C++の絵本」を読んでいるのですが、
「C++の絵本」のオーバーロードに関するサンプルプログラムを以下のように試してみたのですが、
エラーが発生してしまいました。
エラー内容から、原因はarea =GetCircleArea(fRad);のdouble型引数の関数が
GetCircleArea(double,double)なのか、GetCircleArea(double)なのか区別できないということ
のようですが、本書にはエラーになるという記述はありませんでした。
これは区別できないと判断して良いのでしょうか?
ちなみに、本書では引数の数と型が合わないときエラーが発生するとは書いてありました

それから、もうひとつ関連した質問ですが、
下のサンプルで、引数省略したarea=GetCircleArea();も試してみたら、エラーになりました。
これもやはり区別できないからということでしょうか?
つまり、オーバーロードしたら引数省略は不可と考えてよいのでしょうか?

よろしくお願いします

Windows Vista
Visual C++ 2008EE
を使用しています
------------------------------------------
incude <stdio.h>

double GetCircleArea(int radius = 1,double pi = 3.14);
double GetCircleArea(double radius = 1.00,double pi = 3.14);
double GetCircleArea(double radius = 1.00);

int main(){
int nRad=10;
double fRad=10.1;
double area =1.1;
printf("%f\n",area);
area =GetCircleArea(10);
printf("%f\n",area);
area =GetCircleArea(15,3.14159);
printf("%f\n",area);
area =GetCircleArea(nRad,3.14159);
printf("%f\n",area);
area =GetCircleArea(fRad,3.14159);
printf("%f\n",area);
area =GetCircleArea(fRad);
printf("%f\n",area);
return 0;
}

double GetCircleArea(int radius,double pi){
return radius * radius * pi;
}
double GetCircleArea(double radius,double pi){
return radius * radius * pi;
}
double GetCircleArea(double radius){
return radius * radius * 3.14;
}

Re:C++のオーバーロードに関して

Posted: 2010年5月28日(金) 13:42
by たいちう
> double GetCircleArea(double radius = 1.00,double pi = 3.14);
> double GetCircleArea(double radius = 1.00);
>
> area =GetCircleArea(fRad);
>
> これは区別できないと判断して良いのでしょうか?

Yes。
プログラムを書いた人の意図は、前者の呼出か後者の呼出か、
コンパイラには判断できません。
もちろん、書いた人以外の人間にも。

Re:C++のオーバーロードに関して

Posted: 2010年5月28日(金) 16:20
by たかぎ
実際にどんな記述になっていたのかわかりませんが...

今回のような関数を多重定義することも可能といえば可能ですが、決して使い勝手がよいとはいえませんし、いろいろな制約が課せられます。

Re:C++のオーバーロードに関して

Posted: 2010年5月29日(土) 00:11
by skuld
たいちうさん、たかぎさん
ありがとうございます

ずっと気になっていたんですが、
おかげですっきりしました