「C++再考」の訳注集2
第4章とは、、、
こんにちは。今回は、第4章を見てみます。ある程度C++を(自主的に)勉強した人は、読み飛ばしてかまわないと思います。繰り返しますが、私の「C++入門」程度の基礎知識は仮定します。
また、最初の「C++入門」で足りない分は、補足として補いました。必要と思う人は、このページの最後を見てください。
○最初にコンストラクタのことが書いてありますね。初心者が特に注意すべきなのは、ポインタをメンバ変数に持つクラスのことでしょう。
○データはプライベートか?という話では、テンプレートと参照というのが出てきて、初心者はちょっと困るかも知れません。まず、ここで言いたいことは、テンプレートや参照のことではありません。(なんならtemplate<class
T>という部分を取って考えておいてください。参照を使った別例も「良い例」としてあげているのではないので気にする必要はありません。)
要するに「ベクタ(Vector、つまり配列のことですね)本体を変更せずに、その長さだけ変えられる」などというおかしなクラスを作るな、、、ということですね。こういうことを避けるために、private宣言があるわけです。テンプレートと参照の話は、「C++入門」の補足で説明しましょう。
○引数なしのコンストラクタの話では、
Point(int p, int q): x(p),y(q){ }
というコンストラクタがありますね。(これもここでの本論とは関係ないのですが、)これはよく
Point(int p, int q){ x=p; y=q;}
と書いてあるのとほぼ同じ意味です。「ほぼ」というのは、x、yが組み込み型のintとかfloatとかの場合は、(普通のコンパイラなら)同じ意味になるのですが、xとyをプログラマが定義したクラスのインスタンスとすると、そのプログラマが代入演算子などを自由に定義できるので、違った意味にもなりうるのです。また、後者の方が効率が悪くなる傾向にあります。
どちらが良いのかは、そのクラスを作ったプログラマが決めることですが、(個人的な印象では、まず)前者の形の方が、一般的だと思います。
本論に直接関係がなくても、気になって先に進めなくなるかもしれないことを書くから、「訳注」なのです。大切なのは本論ですから、本論を見失わないようにしてくださいね。たとえば、ここでは「引数なしのコンストラクタを作るかどうか決める」のが、とても大事なことなのです。
○仮想デストラクタの話は、とてもわかりやすいと思います。どうでしょうか。この章のリストはみんな大事ですが、当然、これも大事です。
○コピーコンストラクタ、代入演算子は初心者にはとてもいやなところかと思います。(私はいやでした。)しかし、この辺から、C++らしいC++になっていくので、なんとか理解してください。(完璧ではないですが、私の「C++入門25、26」にも書きました。え〜と、そこでは「参照」が説明されていなかったんですよね。この辺に踊っている&という文字のことです。知らない人は、このページの最後を見てください。)
なお、「コンストラクタがリソースを確保する」というのは、簡単に言うと、メンバ変数にポインタがあって、そのポインタが指すインスタンスをコンストラクタで作る(new)ような場合です。たとえば、Nekoというクラスがあった場合、そのインスタンスをメンバに持つ下のようなクラス、Zooが一例です。
class Zoo { Neko *cat; public: Zoo(){ cat = new Neko;} ~Zoo(){ delete cat; } ... };
こういうクラスは、本当によく出てきます(とても重要なんです)が、気をつけなければいけないのです。(これはあくまで初心者へのコメントです。中級以上の人には、今更何言ってんの、というくらい当たり前のことなんです。)
〇あと、気になるのは、「演算子の多重定義(オーバーロード)」です。実は「代入演算子」のところで「演算子の多重定義」はやっています。つまり、「=」という演算子はC++で定義されている「演算子」(というもの)なのですが、自分のクラス用に、定義し直したのが、「演算子=の多重定義」なのです。
演算子も実は特別な形をした関数です。ということは、メンバ関数とグローバルな関数があるように、演算子にもクラスのメンバであるのものとそうでないものがあります。代入演算子はくラスメンバの例でした。
○第4章には、まだ難しいことがあるかもしれません。たとえば、「constな参照を使うとx+y+zなんかも実行できる」なんて話しはどうでしょう?その理由をちゃんと説明するのは、、、ここでは許してください。少し長くなってしまいます。それに、これまでにならったことと、ちょっとした実験と、ちょこっとヘルプを読むことで理解できるかもしれません。まあ、とりあえず、ここは、著者を信じて先に進んでください。そのうちわかってくると思います。
◎とりあえず本筋がわかったら先に進みましょう。
第4章を私の入門を読んだ「初心者」が読むために必要そうな知識を「C++入門補足」に書きました。知らないことがあったら見ておいてください。
テンプレート 98/7/12
参照 98/7/17
演算子の多重定義 98/8/3(内容は7/26に書いたもの)
初心者が、入門25、26や補足を読むのはちょっとつらいかもしれません。もともと、入門にはいれないつもりの(というか、さぼっちゃった)ところを、少しずつ補足しながらなので、話があっちこっちになっています。
しかし、まあ、逆に言うと、、、散らばった話を、よく読んで理解するのは、知的好奇心を満足させ、また理解そのものを深めるはずです、、、。なんちゃって、すみません。あとあともう少しシステマティックなものに書き直したいとは思いますが、、、
ただ、理解する努力をすると、その効果は絶対あります。このHPを読んでいる人は賛成してくれると思いますが、、、。