【Keyword】 explicit

2111 ワード

一、作用の概要
explicitは、クラスのコンストラクション関数の前に、単一パラメータコンストラクション関数のパラメータタイプ(またはパラメータタイプと互換性があり、自動的に変換可能なタイプ)からクラスタイプに暗黙的に移行することを防止するために使用されます.ただし、表示される強制変換は許可されます.
説明:
単一パラメータコンストラクション関数とは、1つのパラメータのみを含むコンストラクション関数または複数のパラメータを含むが、デフォルト値を含まないコンストラクション関数が1つしかないことを意味します.
互換性タイプ:int longなどのコンパイラが自動変換を提供するタイプ
プロセス:
プログラムは、クラス内の条件に合致する単一パラメータコンストラクション関数(二義性がないことが要求される)を呼び出して、一時オブジェクトを作成し、初期化後、メンバー単位の付与方式で一時オブジェクトの内容をクラスオブジェクトにコピーします.
二、基本データ型変換との類似性
int num=10;long number = num;//タイプ互換、変換可能
int* memory_address  = 10;//intとint*は互換性がないため、自動変換は許可されていません
int* memory_address = (int *) 10;//許可、意味がないかもしれませんが、強制変換を許可します.
三、クラスタイプを他のタイプに変換する
1.逆にするということも可能です.ただし、方法が異なり、変換関数が使用されます.
このタイプのタイプ:単一パラメータ構造関数に依存します.
このタイプからタイプ:ユーザー定義の変換関数に依存します.
2.変換関数
形式:operator typeName()/typenameは、operator double()のような変換のターゲットタイプをdoubleに変換することを指定します.
要求:a.クラスのメンバーメソッドでなければならないb.戻りタイプ(この点の同構造関数)c.パラメータを指定しない
使用法:C++11標準の場合、変換関数の前にexplicitを使用して暗黙的な変換を防止し、強制変換のみを開放することもできます.C++98はだめです.
四、コードの例
#include <iostream>
using namespace std;

class DoubleAutoMe
{
private:
	double m_height;
public:
	DoubleAutoMe(double height){m_height=height;};
	operator double(){return m_height;};
	
	void showHeight()const
	{
		cout<<"Sometype to Class without Explicit: "<<m_height<<endl;
	}
};
class DoubleForceMe
{
private:
	double m_height;
public:
	explicit DoubleForceMe(double height){m_height=height;}
	void showHeight()const
	{
		cout<<"Sometype to Class with Explicit: "<<m_height<<endl;
	}
};
int main()
{
	DoubleAutoMe allowed_exactly = 8.11;    //  
	DoubleAutoMe allowed_compatible = 10;   //  ,      
	allowed_exactly.showHeight();
	allowed_compatible.showHeight();

	double double_from_class = allowed_exactly;
	cout<<"Class to Double using type conversion function: "<<double_from_class<<endl;

	//DoubleForceMe not_allowed =8.11;        //   ,  explicit
	DoubleForceMe allowed_force = (DoubleForceMe) 8.11;     //  ,    
	allowed_force.showHeight();
}