#include <iostream>

using std::cout;

class Value {
private:
	int state;
public:
	Value() : state(0) { cout << "Value's default ctor is called.\n"; }
	Value(const Value& other) : state(other.state) {
		cout << "Value's copyctor(Value{state=" << state << "}) is called.\n";
	}
	Value(int i) : state(i) { cout << "Value's ctor(int " << i << ") is called.\n"; }
	Value& operator=(const Value &other) {
		state = other.state;
		cout << "Value's op=(Value{state=" << state << "}) is called.\n";

	}
};

class MyClass {
private:
	Value val;
public:
	MyClass(const Value &v) {
		cout << "Entered MyClass ctor (assignment version).\n";
		val = v;
	}
	MyClass(const Value &v, int dummy)
		: val(v) {
		cout << "Entered MyClass ctor (initialization list version).\n";
	}
};

int main() {
	Value v(123);
	cout << "----------------------------\n\n";

	MyClass obj1(v);
	cout << "----------------------------\n\n";

	MyClass obj2(v, 0);
	cout << "----------------------------\n\n";

	return 0;
}
