どうも、インターネット雑談マン@netzatsudanmanです。
僕は10年ほどソフトウェア開発の会社で働いていまして、今はマネジメント専門なので、開発からは退いてしまったのですが、多少プログラム組んでいた経験があります。
今日は、C++の「クラス」が本当に全く全然理解できないという、
プログラマとしての才能がゼロレベルの方に、
同じくプログラマとしての才能皆無の僕から、
ザックリとした説明をさせていただきます。難しい用語は僕がわからないので使いません。
目次
ぶっちゃけ構造体とそんな変わらん
構造体はわかりますかね?構造体がわかってたらもう大丈夫、同じです。深い話はともかく、自社ソフトのバグ修正程度であれば、これを覚えておけばだいたい大丈夫。
構造体→変数まとめたやつ
クラス→変数も関数もまとめたやつ
あと、privateに属する関数、変数は、クラスでまとめている関数の中でしか使えません。
継承?そんなもん最初は気にすんな!
もう存在する関数の先頭すべてにブレークポイントはって、
全部動き確認すれば流れは理解できる!(筋肉的解決)
よくある説明、「くだものクラスが~」忘れろ!
わかりづらいんじゃ!!
家を作るとしますよね。家を作る時に必要なものと言えば?
そう、設計図!
クラスってのは設計図なんです。
設計図って、ただの紙!
紙面上のトイレで用足せませんよね。紙面上の玄関に入れませんよね。
二次元の住人じゃないんだから。
だから、設計図だけじゃ使えない!
家を作るから、その家が使える。
クラスも同じ!現物がなけりゃ使えないんです!
じゃあどうすりゃいいのよ?
家を建てるのよ。
それをコード的にやる場合は、二通り!以下のどちらか!
例えば、int型の変数numを使いたいなら、
突然「num=0;」とは書かないですよね。
そう!宣言!
使う前に、「int num;」が必要だ!クラスを使うときも宣言が必要です。
もし、
class test
{
int num;
// なんかメンバがいろいろ書いてある
}
というクラスのメンバnumを実際に使いたいなら、
test classdayo;
// ↑test はクラス名、classdayoは変数名
classdayo.num=0;
と、まず最初に書かなければいけません。
もしくはnew!必ずdeleteしないと先輩に怒られるぜnew!
newって何?新しいの?
そう、新しいのよ!!
みんな大好き「int a;」と書いたとき、メモリにはint型一つ分の領域が確保されていますよね。
・・・。
OK、言い直す。壮大なスケールで言い直す。
メモリってなんなんだよ
この世界に、家がひとつあります。
家があるということは、家ひとつ分の土地を使ってますよね。
コンピューターも同じ!
コンピューターの世界=メモリ!
そこに何か作ろうと思ったら、その何か分の土地が必要なわけです。
はい、最初に戻る!
「みんな大好き「int a;」と書いたとき、
メモリにはint型一つ分の領域が確保されていますよね。」
これのこと!
コンピューター世界でint型変数を一つ使いたいから、int型分の土地を確保する。
「ここから、ここまで、int型変数aが使うぜ~~」
それが、
「int a;」!
で、newって何?新しいの?(再)
そう、新しいのよ!!(再)
int a;と同じように、test classdayo;でも宣言はできます。
でも、この書き方だと、その宣言を書いた関数が終了した瞬間に、
「ここから、ここまで、クラスが使うぜ~~」
が、
「もうクラス使わないぜ~~~」状態
になってしまうので、そのクラスは使えなくなってしまいます。
※設計図としてのクラスは使える。また宣言すればいいだけ。
この説明で「使えなくなってしまう」と言ってるのは、宣言したクラス変数「test classdayo」が使えなくなるということ。
でも、newすれば!自分でdeleteするまで!
「ここから、ここまで、クラスが使うぜ~~」
状態が続く!だからアドレスさえわかっていれば、関数を出ても使える!
アドレスって何かって?住所!
コンピューター世界(メモリ)の住所(アドレス)!
クラスに限らず、newしたものをdeleteしないコードを書くと、
先輩にマジギレされる上、超バカにされるぞ!気をつけろ!
メンバ変数・関数の使い方
これはもう、超ざっくり言います。
newでメモリ確保したなら「->」
new使ってないなら「.」
class test
{
int num;
// なんかメンバがいろいろ書いてある
}
↑これ使いたい
test classdayo;
// ↑test はクラス名、classdayoは変数名
classdayo.num=0;
test classdayo2 = new test;
classdayo2->num=0;
以上。
まとめ
はい。ちゃんとしたプログラマーに読まれたら怒られそうな記事ですが、超超超超初心者、初心者というか才能ゼロ、ほんとに1%も理解できない意味不明すぎて会社辞めたいレベルの人(僕)には、なんとなく最初のイメージがつかめるんじゃないかなと思います。
・・・つかめていただけたなら、うれしいです。
とりあえず、
- クラスとは、関数もまとめられる構造体の進化系みたいなもん
- クラスとは、設計図なので、現物を用意しないと使えない
- メモリとは、コンピューターの世界。アドレスとはその住所。
これだけ覚えて寝てください。
適当にサンプルコードっぽいヤツ載せてますが、C++4年くらい組んでないんで、間違ってたらごめんなさーい。あとはgoogle様に頼む。
プログラミングって、教科書作ってる連中が賢い人らなんで、初心者向けの教科書でさえ、表現が難しくてよくわかんねえんだよな・・・。
おまけ:最後の最後にまずいこと言う
「定義」と「宣言」の違いって、長年やってるプログラマでもわかってなかったりします。
そう、僕です。
会社で胡散臭い感じの先輩に「ちゃんと宣言したのか?」と言われたら、単に「用意」とか「準備」の代わりに「宣言」という言葉を使ってると思っていいです。
今回の記事で僕が「宣言」と言ってるものも、実際は定義かも。
いろいろとすいませんでしたっ!!
以上。