「詳説C++」 大城正典 著

詳説C++ 第2版 (C MAGAZINE)
いやー、時間がかかった。他の本の2,3倍時間がかかったかもしれない。分からないまま流し読みで済ませたところも結構ある。それでも読んだ価値があったような気がする。これ読んでからちょこっと「Effective C++」の気になる箇所を見たらすんなり理解できるようになっていた。
結構厚めの本だけど、それでも詳細を省いている機能などもある。C++って思ってたよりずっと深いなあ。


少し印象に残ったところを。

つまり、
 cout << endl;
は、効果の面ではANSI Cで記述した、
 printf("%c",'\n');
に等しいといえます。では、endlは文字定数'\n'なのでしょうか。
 実は、endlは関数なのです。標準C言語およびC++では、関数名をただ書けば、それはその関数へのポインタとして扱われます。

endlは関数だったのか。こういう使い方はうまく応用すれば便利かもしれない。

汎用性の高い関数の引数を意味的に分類してみると、
(1)処理対象の情報を指定する引数
(2)働きの細部を決める補助的な引数
の2種類に分けることができます。汎用性の高い関数は、(2)タイプの引数を1個以上もっているので、汎用性のないバージョンよりも引数が多くなるのです。

C++と直接関係ないけど、やっぱりそうなんだよな。当たり前のことではあるけど、今まで明確に意識してなかった。C++の場合はデフォルト実引数という仕組みで少しは引数が減らせる。

手続き(関数)がほかの手続き(関数)を呼び出しています。その過程において、関数の間で情報(データ)がやり取りされていきます。このような動作原理によって処理が行われるプログラム言語を、手続き型言語(precedural language)といいます。C言語のように手続きが関数の形をとっている場合は、関数型言語(functional language)と呼びます。

関数型言語というとLispHaskellのような名前を思い浮かべるけど、違う意味で使う場合もあるんだな。意味があいまいになってしまうのは専門用語にありがちなことだ。
関数型言語 - Wikipedia

typeid演算子を使った型識別は、便利な機能です。しかし、この機能を使うと、けっきょくは識別した型によって処理を分岐する、List2-10のようなプログラムを作成してしまうことになります。Level2.3で見たように、これはプログラムの硬直化につながります。継承と仮想関数を使って、多相性を十分生かすようにプログラムを設計すれば、たいていの場合はtypeid演算子を使用する必要はありません。

なるほど。言われてみればその通りだ。便利そうな機能はとりあえず使ってみたくなるので気をつけないといけない。

ロケールの機能は、文字コードの変換や、数値・金額・時間の表現など、多岐にわたります。Fig.12-2に示すように、これらの機能はいくつかのカテゴリに分類されています。
 たとえば、文字の種類・文字コードに関する機能を集めた文字カテゴリ、数値の表現に関する機能を集めた数値カテゴリなどです。各カテゴリに属する機能はさらに細かく分類されて、ファセット(facet,特性項目)という単位に分類されます。facetとは、英語で「切り口の面、ある観点から見たものごとの様相・側面」といった意味があります。
 ファセットは、facetというクラスの派生クラスとして定義されており、実際にはファセット型のオブジェクトが各機能を提供します。

ロケール自体にはあまり興味はないのだけど、facetクラスというのが気になる。2次元の表を実装するパターンとして使えるようなものだろうか。

PacketiX Desktop VPN

あまり使うことはないのだけど、前はリモートコントロールソフトとしてVNCを使っていた。今回またその手のソフトを使いたくなって、以前ちょっと話題になっていたSoftEtherを使ってみることにした。今は名前が変わってPacketiX Desktop VPNって名前なんだな。
Desktop VPN で会社の PC に自宅から安全にリモートアクセス


Desktop VPN 2.0は有償なので(訂正:Packetix VPN 2.0が有償で、Packetix Desktop VPNのベータ2は無償でした)1.0の方を入れてみた。俺の使い方はインターネットをまたぐわけではないのであまり威力を実感できるわけではないけど、PCのファイヤウォールの設定をしなくていいだけVNCより楽かな?
PCをまたいだコピペもできる。これはVNCと同じ。


最近VMWareの使い方に慣れてきてしまったので、シームレスにマウスポインタが使えるのはすごく便利に感じる。VMWareだとVMWareの画面から出るのにいちいちCtrl+Altを押さないといけない。VMWareもシームレスに使えるようになってくれないかな。

Javadocの設定

今までJavadocを設定してなかったのでここを見て設定。
Javaの道:Eclipse(3.便利な機能(環境設定))


JSE6のドキュメントはここを設定。
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle


バージョンが上がったときはここのCore API Docsのリンク先を設定すれば良さそうだ。
Java SE - Documentation | Oracle Technology Network | Oracle


ところで5.0のときはJava 2 Standard Edition 5.0という名前だったけど、6ではJava Standard Edition 6という名前で2が取れてたんだな。エディションの小数点も消えたんだ。

リポジトリを別のリポジトリのディレクトリの中に入れる

リポジトリを別のリポジトリディレクトリの中に入れる。
bluegate.org - このウェブサイトは販売用です! -&nbspbluegate リソースおよび情報
bluegate.org - このウェブサイトは販売用です! -&nbspbluegate リソースおよび情報
http://blog.so-net.ne.jp/Silv/2006-03-10-1
このあたりを参考にできた。単純にダンプすると全てのリビジョンのデータがダンプされるのでさすがにファイルがでかい。
それと入れるファイルの数が多くなり過ぎるといろいろ不便なことが出てくるので、サイズやファイル数によるだろうけど、でかいひとつのリポジトリよりも小さい複数のリポジトリにした方が扱いやすいかもしれない。

初期化リスト

初期化リストで基底クラスのprotectedメンバを直接初期化しようとしたらできなかった。それはなんでなんだろうなあ。もちろんコンストラクタの中でなら値を設定できる。基底クラスに引数つきコンストラクタを作って初期化リストではそれを使うことでメンバを初期化できた。うーん、見た目はこっちが正当っぽい。
それからstring型メンバの初期化をする時に、初期化リストの中で文字列リテラルを入れてみたら問題なく動いた(みたいだ)。静的ならなんでも入れられるのかなあ。

リファレンス

C++ではリファレンスが導入されたのでそれを積極的に使おう」という話だけ知っていたので、どんな時でもガンガンとリファレンスを使えばいいのかと思っていたけど、そうもいかないという事が分かってきた。
リファレンスは別の変数なり関数なりを表す。実体のように扱うことができる。なので、リファレンスに別の変数を割り当てようとしても単に参照先の変数にコピーするだけになる。つまり一度定義したリファレンスに別の変数を割り当てることはできない。ということは初期化でしかリファレンスは設定できない。ポインタ変数のように使いまわすことができない。となるとオブジェクトを返す関数の戻り値もなかなかリファレンスで返すわけにはいかなくなる。というか、どういう使われ方をするのか確定してないのならやっぱりポインタで返すのが無難なんだろうな。

C++が前よりは分かってきた

C++が前よりは分かってきた。文法を知っているということと使えることとは違うなあと実感している。今までも知っていた断片的な知識がやっと有機的に結びついてきた。というのはちょっと大げさな言い方かもしれないけど、気づいてみればなぜ今まで気がつかなかったのかが不思議なくらいの初歩的なことがやっと見えてきた。