C++を知りたい(2) 関数
2009/07/14
「やさしいC++」のとおりには勉強せずに、脱線しながら進んで、迷ったら「やさしいC++」を読むという方針にしてみる。
階乗を求める関数
#include <iostream> using namespace std; int fact(int n) { int ans = 1; for (int i = n; i > 0; i--) { ans *= i; } return ans; } int main() { cout << fact(10) << endl; return 0; }
$ g++ fact.cc
$ ./a.out
3628800
関数を使ったりしてみた。javaなどからしたらあたりまえの機能だけど、どこでも変数宣言できるというのは地味に嬉しい。しかし、こんなプログラムなのに、コンパイルするのに1秒くらいかかるってちょっと遅すぎるんじゃないか?最適化オプション(-O3)付けたら更にコンパイルが遅くなった。先行き不安。
階乗を求める関数 再帰呼び出し
#include <iostream> using namespace std; int fact(int n, int acc = 1) { if (n <= 1) return acc; return fact(n - 1, acc * n); } int main() { cout << fact(10) << endl; return 0; }
$ g++ fact.cc
$ ./a.out
3628800
再帰呼び出し版では、デフォルト引数を使ってみた。宣言方法は自然というか普通なので、問題なし。
関数オーバーロード
#include <iostream> using namespace std; double add(double a, double b) { return a + b; } int add(int a, int b) { return a + b; } int main() { cout << add(1, 2) << endl; cout << add(1.5, 2.5) << endl; cout << add(1.1, (double)2) << endl; return 0; }
$ g++ overload.cc $ ./a.out 3 4 3.1
引数の宣言が違う同名の関数を定義できて、引数の型によって呼び出される関数が選択される。第一引数にdouble、第二引数にintを渡した場合(doubleのキャストが無い場合)は、 error: call of overloaded `add(double, int)’ is ambiguous というコンパイルエラーが出る。ところでC++でCタイプのキャストをするのは良くないという話を聞いたことがあるので、あとで調べる。
関数テンプレート
#include <iostream> using namespace std; template <class T> T maxt(T a, T b) { return a > b ? a : b; } int main() { cout << maxt(1, 2) << endl; cout << maxt(3.2, 2.1) << endl; cout << maxt('a', 'b') << endl; return 0; }
$ g++ template.cc $ ./a.out 2 3.2 b
intでもdoubleでもcharでも対応できるような関数テンプレートが定義できた。javaのgenericsより10倍わかりやすい定義の仕方だと思った。
昔より簡単に感じる
実は、昔もC++に手を出したことがあるけど、かなり簡単に感じる。それは、いろんな言語を経験したから、C++のこれらの概念が全く始めて接する概念という訳じゃないからだろうな。でも、oopに入ったら違うかもしれない。*1
*1:昔C++に挑戦したときは、friend関数とか昔全く旨味が理解できなかったけど、今度はどうだろう?