Javaの経験がある自分がC++はどうするのか?を調べたメモ書き。(今はもっぱらPHPとScalaですけど。。。)
言語だったりIDE(VisualStudio)だったり、ごちゃ混ぜです。
クラスの作り方 ヘッダ無し編
調べるうちにこの書き方は1ファイルで完結する(== includeしない)プログラム等、小規模なものにしか使えないので、意味無い気がしてきた。。。
class A{
public:
// コンストラクタ
A(){
// いい感じの処理
}
// デストラクタ C++は開放タイミングが明示的なので必ず呼ばれる
~A(){
// いい感じの処理
}
// 公開されたメソッド
int getNum(){
// privateメソッドの呼び出し
return createNumber();
// thisを使うならアローを使う
// return this->createNumber();
}
private:
int num = 10;
int createNumber(){
++num;
return num;
}
}; //←C++のクラスにはセミコロンが必要。メソッドには付かないのに。。。
クラスの作り方 ヘッダを有り編
現実的に使うことになる書き方。
- includeガードは宣言(h)に書く。 定義(cpp)には書かない。
- CPPがヘッダをincludeする。ヘッダはCPPをincludeしない。
- ヘッダ<=>実装の関係ではなく、機能利用のためのincludeもヘッダのみ。
- Javaのinterfaceの様に「型が実装を知る必要が無いから」と覚える(しかし多態性を実現する訳じゃないので注意)
#ifndef A_HEDAER
#define A_HEDAER
class A {
public:
A();
~A();
int getNumer();
private:
int num;
int createNumber();
};
#endif
#include "A.h"
A::A():
num(10) // メンバイニシャライザと呼ぶ初期化方法
{
// num = 10; という初期化もできるがメンバイニシャライザのほうが効率てきらしい
}
A::~A(){
//いい感じの処理
}
int A::getNumber(){
return this->createNumber();
}
int A::createNumber(){
return ++num;
}
TODO:コンパイルとリンクがincludeの肝なので後でまとめる。今はメモ書き
コンパイルは1つのCPPを.obj
に変換する。このときヘッダはCPPにインライン化。
コンパイル時点では実動作の定義は不要なので、CPPにincludeするのは型定義(ヘッダ)で良い。import java.util.List; List<String> = getList();
のイメージ。(interface(≒ヘッダ)をimportしていて、getListから返却される具象(≒CPP)はimportしない)
次に複数の.obj
をリンクして実行ファイル(.exe
等)にする。
このときにヘッダに対応した実装(cpp=>obj)が必要となる。
コンストラクタの初期化
ここを読むとわかる。
インスタンス生成 メソッド呼び出し
JavaのインスタンスはC++ではオブジェクトと呼ばれることもあるみたい。
// Javaだと未初期化になる書き方だけど、C++ではインスタンスが代入されている。
// メソッド呼び出しはドットを使う。
// 生成したスコープを抜けるとメモリ開放される。デストラクタが呼ばれる。
A a;
a.getNumber();
// Javaと同じくnewして代入するとポインタが代入される。
// メソッド呼び出しがアローになる。
// ポインタではdeleteしないとメモリ開放されない。Javaには無いやつ。
A* p_a = new A;
p_a->getNumber();
delete p_a;
C++クラスの書き方が面倒くさい訳
すごくわかりやすい解説だった。
C++クラスの書き方が面倒くさい訳
ソースのフォルダ分け
Java
packageを分けるとフォルダが物理的に分かれる。
これは言語仕様なのでIDEを使っても一緒。
C++
VisualStdioを使うとフィルタがフォルダ分けをする。(下の画像ではfoo
がフィルタ)
しかしフィルタは見た目だけなので、物理的には同じフォルダにソースが入ってる。
なのでincludeするときは#include "ChildClass.h"
となる。
これはC++の言語仕様ではないので物理的なフォルダ分割も可能。その場合#include "foo/ChildClass.h"
と書く。
TODO:続きを書く