技術的には、後で変更することはできますが、それは良い考えではありません。
Customer() : x("") { }
をし、後でそれを変更します。
const string s = "";
*const_cast<string*>(&s) = "new string";
あなたのコードでこれを使用するには、次のようにパラメータなしのコンストラクタを作成することができます:あなたは、このコードでは良い長い時間の一見のためにそれについて考えた後あなたのコードで:
*const_cast<string*>(&x) = "new string"
実際にはこれは悪い考えかもしれませんが、あなたはこれに別の方法としては、クールな構造体を作成することで、この
の危険性についての詳細はthis postをご覧ください:
template<class T>
class OneTimeAssign{
T data;
bool alreadyAssigned;
public:
OneTimeAssign() : data(), alreadyAssigned(false){ }
void operator=(T&& newData){
if (alreadyAssigned) throw "Error";
data = newData;
alreadyAssigned = true;
}
operator const T&() const{
return data;
}
const T* const operator->(){
return &data;
}
};
あなたは、このようにそれを使用することができます。
OneTimeAssign<std::string> Mine;
Mine = "First assign";
//Mine = "Second assign"; //Runtime Error
std::cout << (std::string)Mine << std::endl;
system("pause");
すべてconstメンバはコンストラクタで初期化されなければなりません。あなたは 'Customer():x(" Some default String "){}'を実行することができますが、それが必要なものかどうかはわかりません。後でそれを本当に変更する必要がある場合は、単に 'const'にすることはできません。もう一つの**危険な**オプションは 'const_cast'を使うことです。 – DarthRubik
矛盾する要件は、現在のデザインの方向がうまくいかないことを意味します。デフォルトのコンストラクタを導入して解決しようとしている問題は何ですか?デフォルトのコンストラクタは、オブジェクトを宣言して後で変更するためによく使われますが、 'const'データメンバを使ってクラスを意味のある方法でコピーすることはできません。 –
あなたが望むものが「後で修正できるかもしれないconstメンバ」であれば、あなたは本当にconstメンバを必要としません。 – molbdnilo