目次

コーディングスタイル

プライベートで書くとき用。

  • 実装はすべてヘッダファイルに
    • 分けるのが手間
  • namespaceは使わない
    • 完全装飾もusingも手間
  • デフォルトでusing namespace std;
  • プロパティどうしよう

リファレンス

C/C++ Reference
標準ライブラリのリファレンス
http://www.cppreference.com/

ロベールのC++教室
よくまとまっているので、基本的なことを再確認するのにいい
http://www1.kcn.ne.jp/~robe/cpphtml/index.html

C++入門
Kitty on your lapの人。ここもよくまとまっている
http://wisdom.sakura.ne.jp/programming/cpp/index.html

ブックマーク

メモリー管理の内側: 動的アロケーションの選択肢とトレードオフ、そして実装
http://www-06.ibm.com/jp/developerworks/linux/041217/j_l-memory.html

AspectC++
http://www.aspectc.org/Home.1.0.html

Deep C++
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep051099.asp?frame=true

規格書

ここから過去ログあさると、ANSI版がよさげ
INCITS/ISO/IEC 14882-2003ってのがANSI版なのかな?
http://www.trickpalace.net/cppll/

ANSI版
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882%2D2003
http://www.techstreet.com/cgi-bin/detail?product_id=1143945

ISO版?
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A2003

JIS
なんでPDF版売ってないかね
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3014%3A2003&dantaiCd=JIS&status=1&pageNo=1

便利ツール

An STL Error Message Decryptor for C++
CodeWarrior用もあるよ
http://www.bdsoft.com/tools/stlfilt.html

C++ lint

C++って意外とlintないんだね。以下のようなところをチェックしてくれるやつがほしい
  • 未初期化バグ
  • 基底クラスがvirtualデストラクタじゃない
  • コピーコンストラクタでのメンバコピー忘れ
  • ctor,dtorのnew,deleteが対応してない(staticに分かるメモリリークチェック)

よさげなのあったけど、売り物($200)
シングルユーザライセンス買ってサーバに置くのってありかな
http://www.gimpel.com/

高いやつ。$1000。ルールを自分で定義できるらしい
http://www.abxsoft.com/codchk.htm

Meyerたんの比較記事。いろいろあるね
http://www.aristeia.com/ddjpaper1_noframes.html

プリプロセッサ

gccのリファレンス。妙な挙動に悩んだときにいいかも。
http://www.sra.co.jp/wingnut/gcc/cpp-j.html

よくごっちゃになるけど、#xは引数の文字列化。x ## yは文字列の連結。

2進リテラル

カコイイ。
http://d.hatena.ne.jp/Robe/20060721

再帰テンプレート版もどこかで見たけど、
こっちのほうがstatic assertが厳しくできそう

#include <stdio.h>

/* 静的アサーション
 * 静的定数 b が偽だとコンパイルエラーにする。
 * b が動的な値の場合もコンパイルエラー。 */
#define SASSERT(b) ((void)(int(*)[(b) ? 1 : -1])0)

/* 2進1バイトリテラル
 * CHAR_BIT に関わらず、8 ビット(16進2桁)まで。 */
#define BYTE2(x) \
  (SASSERT(1 <= sizeof(#x)-1 && sizeof(#x)-1 <= 8), \
   SASSERT((0x##x & ~0x11111111) == 0), \
   (0x##x >>  0) & 0x01 | \
   (0x##x >>  3) & 0x02 | \
   (0x##x >>  6) & 0x04 | \
   (0x##x >>  9) & 0x08 | \
   (0x##x >> 12) & 0x10 | \
   (0x##x >> 15) & 0x20 | \
   (0x##x >> 18) & 0x40 | \
   (0x##x >> 21) & 0x80)

/* 2進2バイトリテラル */
#define WORD2(x1, x0) \
  ((BYTE2(x1) << 8) | BYTE2(x0))

/* 2進4バイトリテラル */
#define DWORD2(x3, x2, x1, x0) \
  ((WORD2(x3, x2) << 16) | WORD2(x1, x0))

int main() {
  printf("%X\n", BYTE2(01011011));
  printf("%X\n", WORD2(11001011, 10000011));
  printf("%X\n", DWORD2(01011011, 11001011,
                        10000011, 00000000));
  return 0;
}

sizeof

char* string = "string";
sizeof(string) == sizeof(char*)
sizeof("string") == 7
なぜなら"string"は、const char*ではなくconst char[]だから。
つまり、上記2進リテラルマクロのsizeof(#x)-1は、
引数を文字列として見た場合の長さ。面白い。

ついでに、

sizeof(void) == 1
sizeof(void*) は、実装依存
らしい。

コンストラクタから例外を投げてはいけない

らしい。
なんで?継承したときに基底クラスのコンストラクタが例外を投げるとまずいから?
つまり、下記でsuperが例外を投げるとhogeがリークすると?

ctor() : hoge_(new Hoge()), super()
{
}

それって、メンバの宣言順序に気をつければいいだけの話?

ctor() : hoge_(new Hoge()), super(hoge_)
{
}

…となるとややこしくなりそうな気はするが。

ちなみに、

A* a = new A();
でAのコンストラクタが例外を投げたとき、newで確保されたメモリは自動解放されるらしい。
operator newがある場合も、対応するoperator deleteが呼ばれるとか。よくできている。

placement new

趣味ではあまり使うこともないが。

なかなか資料がないが、ここを読めば基本的に解決。
http://www.fides.dti.ne.jp/~oka-t/cpp-labyrinth.html

ちなみに#include <new>してある場合、クラスメンバにplacement newを追加しなくても使える。
(<new>内でグローバルのplacement newが定義され、これが使われる)
<new>はいつの間にかincludeされていることが多いので、
placement newは何もしなくても使えると思い込みがちかも。

もっと詳しい話
http://d.hatena.ne.jp/masugata_k/20071120/

STLコンテナのかんたん初期化

operator+=とoperator,のオーバーロードらしい。すげぇ
http://www.codeproject.com/vcpp/stl/PGIL.asp

vector<int>  primes;
set_cont( prime ) += 1, 2, 3, 5, 7, 11;

boostにも取り込まれている
http://www.boost.org/libs/assign/doc/index.html

C++でプロパティ

クラス内部はともかく、外から見たら綺麗でいいね
http://www2s.biglobe.ne.jp/~nunokawa/wiki.cgi?page=C%2B%2B%A4%C7%A5%D7%A5%ED%A5%D1%A5%C6%A5%A3

C++0x

200x年のうちに策定完了、らしい
http://ml.tietew.jp/cppll/cppll/article/12064
http://www.kmonos.net/alang/d/template-comparison.html