C++

空の構造体のサイズ

C++

C++では空の構造体を作ることができます。こんな風に。 struct _EMPTY {}; これは特になにかをしているわけではありません。単純にメンバを持たない構造体なだけです。 果たしてこの構造体のサイズはいくつでしょうか? struct _EMPTY {}; _tprintf(_T("size…

C++でJavaやC#のようにnewを書く方法

C++

タイトルからするとなにを言っているのか分からないかもしれませんが、newの見栄えをJavaやC#と同じようにする方法です。 例えばJavaやC#でHogeというクラスをnewするときは以下のように書きます。 Hoge hoge = new Hoge(); 普通にC++でnewするときは以下の…

インスタンスから静的メンバ関数を呼ぶ

C++

メンバ関数と静的メンバ関数を持つ簡単なクラスを作る class Hoge { public: void Print1() { _tprintf(_T("Print1\n")); } static void Print2() { _tprintf(_T("Print2\n")); }; }; これまで静的メンバ関数を呼ぶにはスコープ演算子を用いて呼ぶものだと思…

C++で関数内で関数を一度だけ呼ぶ方法

C++

ある関数を呼ぶときに、その関数の中で一度だけ初期化する関数を呼びたい、そんなときにどうするかというお話です。 static bool initialize() { _tprintf(_T("initialize\n")); return true; } static void func() { // funcを呼び出したときにinitializeを…

ヘッダーファイルで関数の定義

C++

ヘッダーファイルだけで関数を定義したいときがありますが、定義の仕方によってはリンクエラーになるので、そのときの挙動についてまとめました。 extern(外部リンゲージ) 各ソースファイルに関数が定義されるので、同じ関数が複数のファイルに存在するこ…

デフォルト引数の値を動的に変える

C++

デフォルト引数は関数の引数にあらかじめ定義された値を入れておくことで、関数を呼ぶときに明示的に値を入れない場合はその値が使われるようになります。 static void Print(int n = 3 /* デフォルト引数 */) { printf("%d\n", n); } // 引数を明示的に指定…

GetProcAddressで呼ぶ関数にデフォルト引数はセットされない

C++

関数に修正を加えたい場合に、なるべくプログラムに変更を加えないようにするためにデフォルト引数を加える場合があります。そうすれば今すでに動いているプログラムはデフォルト引数を受け取って動くことになるからです。 しかし、場合によっては影響を与え…

戻り値の型だけが違うオーバーロード関数を作る方法

C++

※開発環境はVC2010です。 C++では関数のオーバーロードは関数名が同じで引数が異なることが条件です。そのため同じ関数名で戻り値の型だけが違う関数を作るとエラーになってしまいます。 static int GetPi() { return 3; } static double GetPi() { return 3…

placement newの速度

普通のnewと、placement newがどのくらい速度が違うのかを比較してみました。 #include "stdafx.h" #include <new> #include "TIME.H" class MyClass { public: MyClass() : m_value(0), m_dbl(0.0) { } MyClass(int value) : m_value(value), m_dbl(0.0) { } pub</new>…