C++クイズ explicitコンストラクタ編
先輩から以下のような問題を出された。
【問題】
class MyClass {
public:
MyClass(int m_):m(m_) {} ;
private:
int m;
};
のようなクラスがある場合、MyClass m1(0); // A
MyClass m2 = 0; // B
どっちの初期化もできちゃうよ。
この2つの違いはなーに?
どっちかしか使えない状況はある?
Aの場合は、普通にM(int m_)のコンストラクタが呼ばれて初期化が行われる。
Bの場合も、結果としては同じだけど、おそらく以下のような手順で初期化が行われる。
- 右辺値が一度 "M(0)" にキャストされ、
- private変数のmが0で初期化されたMクラスのインスタンスが生成され、
- 生成されたインスタンスが、Mクラスのデフォルトコピーコンストラクタでm2にコピーされる
M(int m_)のコンストラクタにexplicit宣言をつけた場合、Mのケースだとコンストラクタを明示しないといけないので、コンパイルエラーになるという話でいいんだろうか?
Cクイズ こっちわからん><
/* MyTypeの定義 */
void set(MyType m, int val);
void inc(MyType m);
void print(MyType m);int main(void)
{
MyType m;
set(m, 0); /* mを0にセット */
inc(m); /* mをインクリメント */
print(m); /* 1と表示される */
return 0;
}/* 各関数の実装 */
このmain関数が、コメントにある期待通り動くようにMyTypeを定義し、各関数を実装することができるか?
もちろん、mainの中身は変えないこと。そして、使えるのは、C言語の言語要素のみ。
???ポインタを渡せるように構造体をtypedefするのか???