我有一个C ++课程,说“客户”,我希望有一个ID的成员,
private:
const string x; // Customer's ID
现在普通的构造函数看起来像这样:
Customer::Customer(const string& ID): x(ID){}
现在,我想构建一个默认构造函数,而不是初始化x。可能吗?因为如果我将它初始化为某个随机值,说“无标题”,那么我就不能再改变它,因为它是一个常量。
所以我根本不应该构建一个默认构造函数,或者是否有可能构建一个不初始化x的构造函数,以后可以这样做?
答案 0 :(得分:2)
现在,我想构建一个默认构造函数,而不是初始化x。有可能吗?
不,这是不可能的。
因为如果我将它初始化为某个随机值,请说"无标题"然后我不能再改变它,因为它是一个常量。
这正是const
的目的。
所以我根本不应该构建一个默认的构造函数,或者是否有可能构建一个不初始化x的函数,你可以稍后再这样做?
好吧,如果x
确实应该const
(我怀疑实际需要它),那么除非你能设法初始化x
,否则你不应该提供默认构造函数来自某些constexpr
的唯一。
答案 1 :(得分:0)
从技术上讲,你可以稍后修改它(但这可能不是一个好主意)。经过长时间的考虑后,请查看以下代码:
const string s = "";
*const_cast<string*>(&s) = "new string";
要在代码中使用它,您可以创建一个无参数的构造函数,如下所示:
Customer() : x("") { }
然后在代码中修改它:
*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");