#author("2021-05-29T06:03:30+00:00","","") #topicpath ////////////////////////////////////////////////////////////////////////////// * 目次 [#e158d013] #contents(); ////////////////////////////////////////////////////////////////////////////// * 下位ページ [#r5d24f18] #ls2(Lang/C++/); ////////////////////////////////////////////////////////////////////////////// * C++ のキーワード [#u4a91d35] - TR1 - スマートポインタ - [[Boost>http://www.boost.org/]] -- [[Boost C++ Libraries>http://boost.cppll.jp/HEAD/]] -- [[Let's boost>http://www.kmonos.net/alang/boost/]] ////////////////////////////////////////////////////////////////////////////// * プリプロセッサ [#k54e3482] ** #error <error-message> [#u2b926b8] - プリプロセッサ実行時、そこを通ると<error-message>を出力して処理を停止する。 - 書式: #error "error-message" ////////////////////////////////////////////////////////////////////////////// * 初期化 [#xe60f555] - コンストラクタでの初期値代入ではなく、「初期値で生成」する。 class CTest { public: CTest(); ~CTest(); ・・・ private: CInfo m_info; int m_id; }; CTest::CTest() :CInfo( 0 ), // 初期値で生成するため、メンバ変数のコンストラクタをここで呼ぶ m_id( 0 ) { // メンバ変数への初期値代入をここに記述しない } //////////////////////////////////////////////////////////////////////////////// * 継承される可能性のあるclassは、デストラクタを仮想にする [#fc01395d] - これは下記のような問題を回避する為。 ++ 継承した子クラスを作る ++ その子クラスが、親クラスの型で自分のインスタンスのポインタを返すような使い方をされる場合がある。 ++ このとき、その親クラスのポインタに対して delete をしてしまうと、子クラスの部分だけがdeleteされていない、中抜けのおかしな実体になってしまう。 ++ その中抜けなインスタンスに対してアクセスすると、そのときの動作が未定義になってしまう。 ////////////////////////////////////////////////////////////////////////////// * 型の別名宣言 using [#kbf8ccce] //============================================================================ ** 型を別名宣言する場合 [#q46e5948] - 従来は typedef で型の別名宣言が出来たが、C++ においては、 using で行う方法もある typedef <元の型名> <新しい型名>; // 従来の宣言形式 using <新しい型名> = <元の型名>; // using を使用した宣言 //============================================================================ ** 関数ポインタに対して宣言する場合 [#gd03dcaf] typedef void (*funcptr)(int); // typedef を使用する場合 using funcptr = void (*)(int); // using を使用する場合 - see also: [[std::function>Lang/C++/C++11#std-function]] ////////////////////////////////////////////////////////////////////////////// * コンパイル時に構造体のサイズを知る [#pb839232] - 下記のようなマクロを仕込むことで、コンパイル時に構造体 foo のサイズが取得出来る。 #define PRINT_SIZEOF(type) PRINT_SIZEOF_(type, __LINE__) #define PRINT_SIZEOF_(type, line) \ void print_sizeof_##line() { asm volatile("size of " #type " is %0" :: "g"(sizeof(type))); } struct foo { type variable; }; PRINT_SIZEOF(struct foo) - これを実行するとエラーが発生し、その際に構造体サイズがコンパイルログとして出力される。 ////////////////////////////////////////////////////////////////////////////// * cast [#qa1343fa] - c++ の cast には4種類がある。 //============================================================================ ** static_cast [#b7b04922] - 静的キャスト - 比較的安全な型変換に使用する。 -- 整数型間や、ポインタ型間 - 例 short s = 0xf5; int i = static_cast<int>(s); //============================================================================ ** dynamic_cast [#e144e7ff] - 動的キャスト - 或る子クラスのポインタから、その親クラスを得る時に使う(Up cast) - 或る親クラスのポインタから、その子クラスを得る時に使う(Down cast) - ポインタ型への変換で失敗すると、結果が nullptr となる。 - 参照型への変換で失敗すると、bad_cast 例外が送出される。 - 例 class base_t { public: base_t() {} virtual ~base_t() {} ... }; class child_t : public base_t { public: ... void set_a( int a ) { m_a = a; } private: int m_a; }; child_t* cx = new child_t; base_t* bx = dynamic_cast<base_t*>(cx); // Up cast child_t* cy = dynamic_cast<child_t*>(bx); // Down cast //============================================================================ ** const_cast [#g6ada1c2] - const キャスト - 変換元の型から const 装飾子や volatile 装飾子を除去する為に用いる。 //============================================================================ ** reinterpret_cast [#yc68579f] - 再解釈キャスト - 互換性のないポインタ型同士の変換や,整数型とポインタ型との間の変換に用いる。 ////////////////////////////////////////////////////////////////////////////// * gcc / g++ [#f33f7483] - gcc (g++) で std ライブラリを使用したコードを make する際、libstdc++.a が必要になる LDFLAGS += -lstdc++ ////////////////////////////////////////////////////////////////////////////// * 参考リンク [#v3be8bd5] - [[Bjarne Stroustrup Interview about C++>http://hp.vector.co.jp/authors/VA000092/jokes/strup.html]]