2004-12-25から1日間の記事一覧

コンストラクターが2回呼ばれるのはもったいない

上述した関数 foo のようにしてインスタンスを返すと、foo 内で一度コンストラクターが呼ばれ、それを return で戻り値として返すときにもコンストラクター(コピーコンストラクター)が呼ばれ、計2回呼ばれていることになる。無駄というかもったいない。1回だ…

続・コピーコンストラクター

#include using namespace std; class A { public: A() { cout の実行結果は、 a b A::A() c A::A(const A&) A::~A() A::~A() d となる。これを見ると、関数 foo の return で戻り値を返す時点でもうコピーコンストラクターが呼ばれているような感じだ。foo …

operator=

まず、 #include using namespace std; class A { public: A() { cout の実行結果は a A::A() b A::A(const A&) c A::~A() A::~A() となり、A y = x; の個所でコピーコンストラクタが呼ばれていることが分かる。 つぎに、 #include using namespace std; cla…

コピーコンストラクター

引数や戻り値を渡す際に、コンストラクターが呼ばれないというよりも、コピーコンストラクターが呼ばれる(のでデフォルトコンストラクターが呼ばれない)と考えたほうが良さそうだ。そして、コピーコンストラクターが未定義だと、暗黙的なコピーコンストラク…

インスタンスを関数の戻り値にしたい

#include using namespace std; class A { public: A() { cout の実行結果は a b A::A() c A::~A() d A::~A() なぜデストラクターの呼び出し数が2回でコンスタクターの呼び出し数が1回なのか? ... http://wisdom.sakura.ne.jp/programming/cpp/cpp12.html …

super はない。

C++ には super というキーワードはない。スーパークラスのクラス名とコンストラクタ名(結局はクラス名と同じ)や、メソッド名を指定して呼ぶ。コンストラクタは普通のメソッドのようにどこからでも呼べる。 #include using namespace std; class A { public:…

ポインターがスーパータイプの場合

ポインターが指すインスタンスの(実行時の)型よりも、そのポインター変数の型がスーパータイプだった場合、そのポインター変数の型の段階でメソッドに virtual がないと、サブタイプでのメソッドのオーバーライドが無視され、呼ばれない。 #include using na…

virtual

virtual は、いったん付くと継承関係の子にも暗黙の内に付く。取り消しはできない。 class T { public: int f(int x); }; class U : public T { public: virtual int f(int x); }; class V : public U { public: int f(int x); // virtual が付いているのと…

C++

晴れ。 なぜかいまどき C++ を勉強している。とほほ... 以下、Java との差分になるようなメモ。