C++ の思い出と C++11 (ja)

昨年春に購入してそのままにしていた「プログラミング言語 C++ 第 4 版」を読み始めました。かつて C++ を勉強していた時期があって、その頃と言語仕様がかけ離れていたら嫌だなと思いつつ、ページをパラパラとめくりながら差分を確認していたところ、思いがけず最初の章を読み切ってしまいました。

私が最初に C++ と出会ったのは、1994 年頃だったと記憶しています。当時 ANSI/ISO C 完全準拠の C コンパイラを欲していた私が、既に使用していた Microsoft Quick C 2.0 にあれこれ難癖を付けてようやく親に買ってもらったものが、発売されて間もない Microsoft Visual C++ 1.0 Professional でした。もっとも、必要としていたのは同梱されていた Microsoft C/C++ コンパイラ 8.0 と周辺のツールだけで、Windows の開発環境には結局触らず仕舞いでしたが、コンパイラが初期の C++ をサポートしていたため興味本位で C++ の世界に足を踏み入れました。元々 C と x86 アセンブラを使っていましたし、当時は Java も存在しない時期でしたので、何の抵抗もなく C++ のチュートリアル (これが不出来で後々泣かされる羽目になるのですが) を読み進めていました。そうした土壌があったことから、1998 年の年末か 1999 年の年始 (時期は不明瞭ですが、購入したのは今はなき秋葉原のラオックス・ザ・コンピュータ館だとはっきり覚えています) に発行されたばかりの「プログラミング言語 C++ 第 3 版」を購入しました。正直、難しい本でしたが、後半のストラウストラップによるオブジェクト指向プログラミングの部は良い刺激となりました。

諸般の事情 (はっきり言ってしまえば就職) により C++ から 15 年以上も遠ざかっていたわけですが、かつて ANSI/ISO C++ と呼ばれていた仕様は数度の改訂を受けて C++11 となり (既に C++14 という仕様もあるようです)、時代に合わせて随分と変わっていました。例えば、

  • ラムダ式 (実は Java よりも数年早い)
  • マルチスレッド - 標準ライブラリによるサポート
  • 正規表現など拡充された標準ライブラリ

あたりは、私が知っている C++ には存在しなかった仕様です。裏を返せば、それ以外の仕様はそれほど大きく変わってはいないわけで、15 年以上前の知識も (思い出せれば) まだまだ生かせそうです。

とか、

とかね。

virtual ではないデストラクタを持つクラスを継承してはいけないというのは、確か「Effective C++」に書いてあったかと思います。大雑把に言うと、virtual 宣言しないデストラクタは vtbl 管理から外れてしまうので、本来ならファイナライズ処理でデストラクタの vtbl を辿って派生クラスのデストラクタから順に呼び出されるべきところが呼び出されなくなってしまう (そのために派手なメモリリークを起こす) からくり...だったはず。

悪名高い多重継承や演算子オーバーロードも、忌避しなければならないほどではなく、プログラムの設計さえまともならば、これほどありがたいものはないくらいに便利だと個人的には思っています。さすがに ATL (Active Template Library) のエントリポイント (4 重の多重継承クラスとして実装されている) には躊躇しましたが。

ちなみに、C++ の "Hello, world" はこのようなものになります (実は 1998 年頃から変わっていない)。

#include <iostream>

int main()
{
    std::cout << "Hello, world" << "\n";
    
    return 0;
}

{ } の位置が Java と微妙に違います。Java 風に書いても文法上は正しいのですが、C/C++ ではこちらが多数派。

「プログラミング言語 C++ 第 4 版」を読み終わったら、その時の感想を書こうと思います。C++ はまだまだ元気な言語です!