2章のまとめ③
#コンソールからの入力
コンソールから出力 std::cout
コンソールから入力 std::cin
文字列入力には、1行を取得できるstd::getline()関数を利用
std::getline(std::cin,line)
#関数のオーバーロード
引数やreturnは違うが同じ名前の関数を定義できる。なんの定義もなく関数を宣言すれば使えるけど、オーバーロードした関数の中で、元の関数を使うのも賢い。これは教わらないと瞬間的にでない発想だった。。。
int sum(int a, int b, int c) {
int d = a + b + c;
return d;
}
int sum(int a, int b) {
return sum(a, b, 0);//↑のsumを呼んでる
}
仮引数の型が異なっていても、呼び出しの方の実引数でどの関数か判断できるため、異なる引数型の関数でも同名可能。
##型が違うオーバーロード
その構造体専用のオーバーロード関数も定義可能
struct vec2d{
int x;
int y;
};
int add(int a, int b){
int c = a + b;
return c;
}
//vec2d専用のadd関数(引数も戻り値も異なる)を新しく定義できる!
vec2d add(vec2d lf, vec2d ri){
vec2d v;
v.x = le.x + ri.x;
v.y = le.y + ri.y;
return v;
}
引数のタイプがint double / double int とかのパターンはコンパイラが暗黙型変換できないので利用不可だが、どちらの引数もfloatだった場合はdoubleをつかったオーバーロードが呼び出されるので注意が必要とのこと。これは、より安全な型変換のほうが優先されるため。(floatよりdoubleのほうが表現できる変数の幅が広い)・つまりオーバーロード解決は暗黙の型変換が少なくて済む(データの欠損が発生しずらい)ものを優先的に呼び出す。
#デフォルト引数
関数呼び出し時に実引数が省略されている場合、関数内部に暗黙的に渡される実引数をていぎしておくこと。実引数側の欠損を補うことができる。順番的に最初や途中の引数がデフォルト引数を設定できないことに注意。
#結局オーバーロードかデフォルト引数か
指針としては、
オーバーロード:引数が省略されたときに処理の中身を変える必要があるもの
デフォルト引数:引数が1つずつ省略されても問題ないもの、関数の処理が変わらないもの
にする