自動変換拒否


暗黙の変換を行わない

コンストラクタ関数が1つの引数を受ける場合
暗黙的に代入演算子を用いることができます
この構文は、オブジェクト型の配列を初期化する時に使いました

CLASS obj(n);
CLASS obj = n;

上の二つのオブジェクトの初期化文は、まったく同じことをやっています
#include<iostream>
using std::cout;

class Kitty {
public:
	char *str;
	Kitty(char *str) { this->str = str; }
};

int main() {
	Kitty obj1("Kitty on your lap\n");
	Kitty obj2 = "Card Captor SAKURA\n";

	cout << obj1.str << obj2.str;
	return 0;
}
このプログラムは完全に有効です
obj2 = "" という構文は、文字定数のポインタをコンストラクタに渡します

しかし、実際は代入文がコンパイラによって自動的に処理されています
コンパイラは、一つの引数しか受けないコンストラクタがあった場合
そのクラスに対して変換関数を暗黙的に生成していることになります

代入演算子を使った初期化が許されない場合
もしくは、暗黙的な変換関数の生成を拒否する場合は
コンストラクタ関数の宣言に explicit キーワードを指定します

explicit constructor( arg ) {...

このように宣言することで、型変換をサポートしなくなります
#include<iostream>
using std::cout;

class Kitty {
public:
	char *str;
	explicit Kitty(char *str) { this->str = str; }
};

int main() {
	Kitty obj1("Kitty on your lap\n");
	//Kitty obj2 = "Card Captor SAKURA\n";

	cout << obj1.str;
	return 0;
}
このプログラムの Kitty() コンストラクタは、暗黙的型変換をサポートしません
そのため、引数が一つにもかかわらず代入演算子による代入ができません
コメント化している一行をコンパイルすると、エラーが発生します

explicit キーワードは、一つの引数を受け取るコンストラクタでのみ有効です
それ以外のコンストラクタは暗黙の型変換に関与しないので、指定しても意味がありません


explicit

コンストラクタにのみ指定できる指定子です
explicit として宣言されたコンストラクタは、暗黙の型変換とは見なされません

複数の引数を取るコンストラクタは暗黙の型変換に関与できないので
そのようなコンストラクタに explicit を指定しても意味がありません



前のページへ戻る次のページへ