7行目にあるような,引数が1つだけのコンストラクタは,explicitとして宣言されていない限り,暗黙の変換に使われます。
オフトピック
なお,この「引数が1つだけのコンストラクタ」には,省略可能な引数を持っており,1個だけの引数を与えることができるようなコンストラクタを含みます。
コード:
class Foo { public: Foo (int x, int y = 0); };
とか
コード:
class Bar { public: Bar (int x = 0, int y = 0, int z = 0); };
とか。
今回の場合,16行目の代入においては
であるため型が一致せず,本来は代入できないのですが,右辺をSampleクラスのコンストラクタを使った変換を行うことによって,両辺ともSample型にすることができます。
つまり,
とすることで,両辺の型が一致するため,代入が出来ます。
これを,コンパイラが自動的に行っています。
オフトピック
もちろん,Sampleクラスにoperator = (int)があれば代入できますが,今回の話には関係しません。
なお,このユーザー定義の関数を使った暗黙の変換は1回までとなっています。
つまり,
コード:
class Sample2 {
public:
Sample2() {};
Sample2(Sample sample){}
};
という型があっても,
は2度の変換が必要になるため失敗します。