経験体験

C++のクラスとメモリが1ミリもわからない初心者への雑な説明

どうも、インターネット雑談マン@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様に頼む。

プログラミングって、教科書作ってる連中が賢い人らなんで、初心者向けの教科書でさえ、表現が難しくてよくわかんねえんだよな・・・。

おまけ:最後の最後にまずいこと言う

「定義」と「宣言」の違いって、長年やってるプログラマでもわかってなかったりします。

そう、僕です。

会社で胡散臭い感じの先輩に「ちゃんと宣言したのか?」と言われたら、単に「用意」とか「準備」の代わりに「宣言」という言葉を使ってると思っていいです。

今回の記事で僕が「宣言」と言ってるものも、実際は定義かも。

 

いろいろとすいませんでしたっ!!

以上。