クラスをヘッダファイルとソースファイルに分けて書く時、ヘッダ側のメンバ関数に仮引数を書く必要はあるのでしょうか?

参考書などを読むと、両方のファイルに同じように仮引数を宣言してありますが、下記のように型だけ指定しても問題なく実装できてしまいます。

class Tes{
public:
  void Foo(int);
};

また、ヘッダ側の仮引数が実装側の仮引数と異なっても、型さえ同じであればこちらも問題なく実装できます。

これらのことから、仮引数は書かなくてもいいのかなと勝手に思ってるわけなんですが、この方法に何か問題はあるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

仮引数の型は必要ですが、名前はあっても無くても、関数本体と異なっていてもかまいません。


型が違うと別関数になってしまうので問題があるかもしれません。


ちゃんと意味のある名前で、定義と同じにしておくと
・プロトタイプだけを見て、引数の意味がわかる
・IDEがヒントを表示してくれるかもしれない
・プロトタイプと定義とで同じ意味になっている、ということが確認できる。
というあたりが考えられます。

例)
int hoge(int x,int y) ; // xとyを指定する、ということが、プロトタイプでわかる。
...
// 定義
int hoge(int y,int x) {
//(警告もエラーも出ないけど)プロトタイプと見比べたら逆になっているから
//もしかしたら期待した動作になっていないかも、という予想はできる。
....
}
    • good
    • 0
この回答へのお礼

>>名前はあっても無くても、関数本体と異なっていてもかまいません。
ありがとうございます。おかげでスッキリしました。

>>プロトタイプだけを見て、引数の意味がわかる
確かに可読性を考えると、書いてある方がよさそうですね。
自分でちょろっとプログラムを書くならともかく、規模が大きくなりそうなら仮引数名も書こうと思います。
回答ありがとうございました。

お礼日時:2016/03/21 07:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Qfoo1.txt、foo2.txt、foo3.txt…とファイル名をつけたいとき

プログラムの一部でファイルを作成しておりまして、
foo1.txt、foo2.txt、foo3.txt…のように
foo+変数.txtとなっており、変数を変える(増やす)ことで複数のファイルを作っていきたいのですが、

このように作成したいファイル名の途中に変数を含んでいる場合、どのようにすればよいのかをご教授願います。

現在、ファイルを作成する関数(関数の中身はおそらく関係してこないと思うので割愛させていただきます)を作成し、
make("foo.txt")のように記述しておりますが詰まってしましました。
どうぞ宜しくお願いします。

Aベストアンサー

つまり
char str[16];
int count;
for(count = 0; count < 10; count++)
{
sprintf(str,"foo%d.txt",count + 1);
}
とすると
strにファイル名が入っている。

QC言語において、関数とその役割、また、引数とその役割、仮引数、実引数とは?

C言語初心者です。
そもそもPC使うのも苦手ですがよろしくお願いします。
C言語において、関数とその役割、また、引数とその役割、仮引数、実引数の役割を、実例を用いて簡潔に説明していただけると助かります。お願いします。

Aベストアンサー

そんなに一気に理解しようとしても難しいですね。
http://www.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html
を眺めてみてください(仮引数と実引数の意味が書いてある。ただしC言語であんまり仮引数がとか実引数が、という言い方はしないような)。
C言語においては全ての処理のかたまりが「関数」です。関数は何かの処理を行って値を返すことも返さないこともあります。
ここの例でいうとf(int x)は値を返す関数、main()は返さない関数で、ここからプログラムの処理が始まります(そういうルールになっている)。
このページのプログラムはちょっと古い書き方なんで今だと警告が出る可能性があります。

QC言語の関数の実引数と仮引数の名前について

 C言語で関数を使う場合、実引数と仮引数の名前(変数名)は、変えなければならないのでしょうか、同じでもいいのでしょうか。C言語のルールでは、どうなっているのでしょうか。よろしくお願い致します。

Aベストアンサー

同じでも構いません。

それぞれの変数の有効範囲(スコープ)が異なりますので、問題ありません。

実引数は定義場所により有効範囲は異なりますが、仮引数はその関数の中でのみ有効です。
両方の範囲が重なった場合はその関数内では仮引数の方が有効になります。

Q関数の仮引数・実引数、またプログラムの計算についての正誤

漸化式で計算を求めるプログラムを作成したいのですがわからないところが出てしまったのでご教授のほうお願いします。
levin()関数の中で漸化式の計算を行っているのですが、その関数の中身の●の部分をどう表現したらいいのかわかりません。仮引数や実引数をどのように設定するか、もう一つはこのプログラムで漸化式の『alpha』を求めることができるのか、また間違っているなら指摘していただけるとありがたいです。プログラムはめちゃくちゃだと思いますがよろしくお願いします。

#include<stdio.h>

#define SIZE 100
#define M 1

double levin(●, ●);

int main(){
double a[SIZE];
double r[SIZE];
double alpha;
int i;
int m;
a[0] = a[1] = 0.0;
m = 0;
alpha = r[0];

for(i = 0; i < M; i++){
levin(●, ●);
}
return 0;
}

double levin(●, ●){
int m = 50;
int k;
double beta = 0.0;
double km;
double a[SIZE];
double r[SIZE];
double new_a[SIZE];
double alpha;

for(k = 0; k <= m; k++){
beta += ((a[k] * (r[m + 1 - k]));
}
km = - (beta / alpha);

new_a[0] = 1;
new_a[++m] = 0;

for(k = 0; k <= m; k++){
new_a[k] = ((a[k]) +((km) * (a[m - k])));
}
alpha *= 1 - ((km) * (km));
printf("%lf\n", alpha);
a = new_a;
return 0;
}

漸化式で計算を求めるプログラムを作成したいのですがわからないところが出てしまったのでご教授のほうお願いします。
levin()関数の中で漸化式の計算を行っているのですが、その関数の中身の●の部分をどう表現したらいいのかわかりません。仮引数や実引数をどのように設定するか、もう一つはこのプログラムで漸化式の『alpha』を求めることができるのか、また間違っているなら指摘していただけるとありがたいです。プログラムはめちゃくちゃだと思いますがよろしくお願いします。

#include<stdio.h>

#defi...続きを読む

Aベストアンサー

まずは、簡単なところから、インデントしたほうがいいですよ。{}のなかを
TABキーで一段さげる。そうするとずっと見やすくなります。ちなみに関数の直後に{をつけるのは一般的ではない気がします。
●、●の部分ですが、引数を利用して関数の呼び出し元に計算結果を返すかどうかで変わってきます。値を戻すのならば、ポインタを使用します。
関数は、double levin(●, ●)と宣言されていますが、
実際にreturn 0;としており、levin()関数は、必ずゼロを返しています。
XXX = levin(aaa, bbb); でXXXに計算結果を期待しているのでしたら、このプログラムは、間違えています。
ここは、私の知識不足かもしれませんが、どのような漸化式か提示いただけないとプログラムの内容(アルゴリズム)が正しいかどうか判断できないと思います。


このカテゴリの人気Q&Aランキング

おすすめ情報