「C++再考」の訳注集7
    第9章 単純もまた良し、、、

こんにちは。(おひさしぶりです。)
 突然ですが、他大学の情報系の教員同士が顔をあわせると、まず、「お宅では何教えてます?Cですか?VBですか?デバッグどうしてます?MFCの授業じゃ学生ついてこれないんじゃないですか?それにしても、最近のバージョンアップ速すぎますよね。もう少し、ゆっくりにしてくれないと体が持ちませんよ。」なんて話になります。頼りなさそうですが、私も含めてこういう人たちは、ちゃんと時代にあった授業をやろうとしているまじめな先生なんです。自分でそう言っちゃうのもなんですが、、、。(ところによっては20年も前から同じ授業をしている大先生もいるそうです。^^)
 さて、第9章は、スタンフォード大学での授業内容だそうで、私にはとても参考になりました。日本ではUCLAなんかの方が有名かもしれませんが、スタンフォードは米国の名門大学です。短期の招待講義ですが、まあ、こんな授業をやっているんですね。

 第9章は字をならべて絵を描くためのクラスをなるべく単純に作るという話で、C++の文法を知っていれば、後は、よく考えればわかると思うのです。一応、初心者に補足すべきことがらをちょっと書いてみましょう。もう、初心者でないという人には、今更の内容です。

○char *init[]={"Paris","in the","Spring"};
 C++(やC)では"Paris"などは、文字列そのものではなく、文字列Parisの最初の文字Pへのポインタを表します。したがって、{"Paris","in the","Spring"}はchar *の配列なのです。上は
 char* init[3]={"Paris","in the","Spring"};
の方がわかりやすいかもしれませんが、同じ意味です。[]内の数字はこうゆうときには省略できるのです。ちなみにParisはおフランスのパリですね。

○ostream& operator<<(ostream&, const Picture&);
 演算子<<の多重定義(つまり自分流の定義)をするぞ、という宣言です。演算子の多重定義の一般論については、C++補足を見てください。上の式は複雑そうですが、
 cout<<p; //pはPictutreオブジェクト
なんかを定義するという意味です。こういう形で覚えた方がいいかもしれません。
 よく使っているcoutは実はostreamというクラスのインスタンス(=オブジェクト)だったのです。この演算子を多重定義した場合、普通は、最後にostreamオブジェクトへの参照を戻すように定義します。

○hcat、vcatの英語
 よくある略英語ですが、hはhorizontalで水平(方向)、vはverticalで垂直(方向)を表します。catは私の好きな生き物のことではなく、concatenateの略で「つなぐ」という意味です。

○return m>n ? m: n;
 「m>n ? m: n」と書けば、m>nならmをそうでない(m<=n)ならnを戻せという意味です。つまり、「?と:」は「?」の前が正しければその「:」の前のもの、そうでなければ「:」の後のものを戻すもの(演算子)なのです。
 ちなみに、maxは使われるときにもわざわざPicture::maxというように書かれていますが、これは気にしなくてよいと思います。また、114ページでは、maxの前にstaticという文字がいきなりはいっています。こうするとメンバ変数でstaticがついているもののみにアクセスできるようになる、、、のですが、staticな変数もないですし、これもここでは必要ないように思います。

○strlen
これは文字列の長さを戻す関数です。array[i]などは文字列の最初の文字へのポインタですが、文字列を表しているわけです。これをstrlenに渡すとその文字列の長さがわかるのです。

○111ページ真ん中辺「この関数はフレンドなので、、、」
 えーと、ここまで読んで、いきなりという感じですね。「この関数はフレンドfriendにするので、、、」とした方がよかったですね。(原文には忠実なんですが、、、。)つまり、後で、この関数をフレンドに宣言するのですが、著者はもうここでその気になっているのでした。で、フレンドですが、これは114ページを見てください。Pictureの宣言のはじめの方にならんでいるfriendの行がそうです。こうすると、friendの後の関数や演算子がPictureのprivateなデータや関数を使えるという意味です。(これらの関数や演算子がこのクラスのメンバになるという意味ではありません。)
 friendを多用すると、privateの意味がなくなるので注意して使いましょう、とは大抵の教科書にあるせりふですが、実際、そうだと思います。

前のページ
後のページ
訳注の目次
総目次