初期化時の代入

変数初期化時の代入では、コンストラクタと代入演算子のどちらが呼ばれるのか気になったので、実験してみた。

#include <iostream>
using namespace std;

#define DEBUG(s) do { cerr << (s) << endl; } while(false);

class Foo {
private:
  int i;
public:
  Foo();
  Foo(int i);
  Foo &operator=(int i);
  int value();
};

Foo::Foo() {
  DEBUG("Foo::Foo()");
}

Foo::Foo(int i) : i(i) {
  DEBUG("Foo::Foo(int i)");
}

Foo &Foo::operator=(int i) {
  DEBUG("Foo &Foo::operator=(int i)");
  this->i = i;
  return *this;
}

int Foo::value() {
  return this->i;
}

int main() {
  Foo foo = 100;
  cout << foo.value() << endl;
  foo = 200;
  cout << foo.value() << endl;
}


~/cpp$ g++ foo.cpp -o foo && ./foo
Foo::Foo(int i)
100
Foo &Foo::operator=(int i)
200
初期化時の代入はコンストラクタを呼ぶ…と。