ポリモーフィズム
共通のインターフェイスを持ちながらも、メッセージを受け取ったインスタンスがそのクラスによって違う振る舞いをすること。
カプセル化
データとそれを操作する手続きを一体化して「オブジェクト」として定義し、オブジェクト内の細かい仕様や構造を外部から隠蔽する仕組み。
継承
既に定義されているクラスの性質を引き継いで、拡張や変更を加えた新しいクラスを定義すること。
関数や変数の記法について
関数はパスカルケース、変数はローワーキャメルケースまたはスネークケースがよさそう。
参考: http://qiita.com/yimajo/items/a3fac0026c07ec538fc2
プロトタイプ宣言とは
要するに関数の前方宣言のことらしい。
参考: http://d.hatena.ne.jp/unageanu/20070825
出力演算子と入力演算子
出力演算子 <<
を使ってコンソールに文字列を出力する。
std::cout << "Hello, world!";
1つの式で複数の項目を出力することもできる。
std::cout << "Hoge" << "Piyo";
入力演算子 >>
を使うと標準入力から入力を受け取れる。
int n;
std::cin >> n;
1つの式で複数の項目を入力することもできる。
int a, b, c;
std::cin >> a >> b >> c;
コメント
/* */
の書き方のコメントはネストできない。
これは例えば Objective-C なんかも同じで、いつも不便に思う。
クラスの定義
class MyObject {
// 非公開関数と変数
int num;
public:
// 公開関数と変数
void setNum(int num);
int getNum();
};
クラス定義のブロックの最後にセミコロン ;
を忘れがちなので注意。
関数の定義
関数をクラスにリンクするために ::
という虫のようなものを付けて定義しなければならない。
void MyObject::setNum(int num)
{
this->num = num;
}
関数のオーバーロード
例えば、Cで絶対値を得るための関数というと abs
labs
fabs
のように型ごとに名前の異なる関数が定義されているけど、こんなの人間が覚えられるわけないので、共通のインターフェイスを持たせておいて型ごとに別の関数を呼び出すようにすればいいのではないかという考え方。
int myabs(int n);
long myabs(long n);
double myabs(double n);
オーバーロードをするためには関数の引数の型や個数が異なっている必要がある。
なので戻り値だけが異なる関数のオーバーロードはできない。
CとC++の違い
- Cでは引数を取らない関数は
f(void)
のように定義しなければならないが、C++ではf()
のように空のリストで引数がないことを表現できる - C++には
bool
型が定義されており、true
とfalse
を利用できる
疑問など
- クラス定義時における関数の定義を完全に非公開にはできないのか。例えば、ヘッダーファイルのクラス定義には公開関数だけを書いておいて、実装ファイルの方で非公開な関数を追加で定義するなど。
- pimplイディオムを使うことで非公開にできるが、カッコ悪い
- http://pokotsun.mydns.jp/?p=4054
- http://tercel-tech.hatenablog.com/entry/2012/11/02/122344