差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
目次
#contents
*コーディングスタイル
プライベートで書くとき用。
-実装はすべてヘッダファイルに
--分けるのが手間
-namespaceは使わない
--完全装飾もusingも手間
-デフォルトでusing namespace std;
-プロパティどうしよう
--リードオンリーなら、constにしてコンストラクタで初期化
--[[マジカルテンプレート>http://www2s.biglobe.ne.jp/~nunokawa/wiki.cgi?page=C%2B%2B%A4%C7%A5%D7%A5%ED%A5%D1%A5%C6%A5%A3]]
--[[いっそ独自拡張を使う>http://ml.tietew.jp/cppll/cppll_novice/thread_articles/1640]]
--アクセッサはできれば書きたくない
*リファレンス
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