C++クラスの注意事項

1363 ワード

1,explicitキーワード
クラスのコンストラクション関数では、コンストラクション関数に入力変数が1つしかない場合、explicitキーワードを追加しない場合、次のコードなど、実際にこのようなタイプに変換する暗黙的な変換メカニズムを定義します.
class Sales_data {
	friend Sales_data add(const Sales_data&, const Sales_data&);
	friend std::istream &read(std::istream&, Sales_data&);
	friend std::ostream &print(std::ostream&, const Sales_data&);

public:
	Sales_data() = default;
	Sales_data(const std::string &s, unsigned n, double p):
			   bookNo(s), units_sold(n), revenue(p*n) { }
	Sales_data(const std::string &s): bookNo(s) { }
	Sales_data(std::istream&);

	std::string isbn() const {return bookNo; }
	Sales_data &combine(const Sales_data&);
private:
	double avg_price() const
		{return units_sold ? revenue/units_sold : 0; }
	std::string bookNo; 
	unsigned units_sold = 0;
	double revenue = 0.0;
};
の3番目のコンストラクション関数は、1つのstringタイプの入力しか受け入れられません.この場合、Sales_を使用する必要があります.Dataクラスの場所ではstringを代替として使用できます.
string null_boolk= "999-999";
item.combine(null_book);
上の文では、コンパイルツールは完全に正しくコンパイルできますが、コンストラクション関数の前にexplicitキーワードを付けると、このような暗黙的な変換はコンパイルできません.次のようなコンパイルエラーが発生します.
main.cpp:9:15: error: no viable conversion from 'string' (aka       'basic_string') to 'const Sales_data'         item.combine(null_book);
この場合,暗黙的に変換することなく,表示的に初期化するしかない.