質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

805閲覧

コンストラクタのまとめ方

erumoa400

総合スコア14

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/09/30 09:34

分数の処理についてのコードなのですが、3つのコンストラクタを一つにまとめる方法がわからず困っています。
デフォルトは分子=0,分母=1で考えています。

C++

1class Fraction { 2private: 3 int num 4 int den 5public: 6 Fraction(); 7 Fraction(int); 8 Fraction(int, int); 9}; 10 11Fraction::Fraction() { 12 num = 0; 13 den = 1; 14}; 15 16Fraction::Fraction(int number) { 17 num = number 18 den = 1; 19}; 20 21Fraction::Fraction(int inNum, int inDen) { 22 num = inNum; 23 if (inDen == 0) { 24 den = 1; 25 } else { 26 den = inDen; 27 } 28};

試行錯誤していた際にデフォルト引数を2つ用意してこのようなコードの時にうまく処理が行えたのですが、宣言時と引数の名前が違っているのに処理ができたのはどうしてでしょうか?

C++

1class Fraction { 2private: 3 int num 4 int den 5public: 6 Fraction(int num = 0, int den = 1); 7}; 8 9 10 11Fraction::Fraction(int inNum, int inDen) { 12 num = inNum; 13 if (inDen == 0) { 14 den = 1; 15 } else { 16 den = inDen; 17 } 18};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

宣言時と引数の名前が違っているのに処理ができたのはどうしてでしょうか?

言語仕様でそう規定されているから。
大事なのは型であって、仮引数名は(いわば)付け足し です。

だからこんなん↓でもOK

C++

1class Fraction { 2private: 3 int num 4 int den 5public: 6 Fraction(int = 0, int = 1); 7};

投稿2021/09/30 09:41

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erumoa400

2021/09/30 16:07

そういう仕様だったんですね 宣言時と名前が違うのってすごい違和感なのですが受け入れるしかないですね 回答ありがとうございました。
guest

0

そういう仕様だからです。

C++ の関数宣言において引数名は一致させる必要もありませんし、不要であれば省略してもかまいません。 (引数の型だけ書いてもOK。) プログラマにとって引数の意味をわかりやすくするという以上の意味はないです。

投稿2021/09/30 09:43

SaitoAtsushi

総合スコア5466

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erumoa400

2021/09/30 16:09

そういう仕様なんですか... 他の言語だとどうなんでしょうね 回答ありがとうございます
SaitoAtsushi

2021/09/30 18:16

C/C++ のように宣言と定義を分離する仕組みが少数派のように思うので、他の言語でどうなのかを考えるのはあまり意味がないように思います。
guest

0

関数プロトタイプの仮引数名は、その関数の定義で用いた仮引数名と異なっていても構いませんし、名前を省略しても構いません。
省略しても構わないのに書くのは、そのほうがとてもわかりやすいから。
でも名前を書くと、それもプリプロセッサのマクロの影響を受けるので、書かないほうが安全、という意見もあります。

投稿2021/09/30 09:46

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/09/30 09:51

> でも名前を書くと、それもプリプロセッサのマクロの影響を受けるので、書かないほうが安全、という意見もあります。 あたしゃそれには"異議あり"ですね。型だけでは意図が伝わらんから。 Fraction(int = 0, int = 1); // どっちが分子? どっちが分母?
erumoa400

2021/09/30 16:11

プリプロセッサのマクロ後で調べておきます... 回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問