具有常量成员的默认构造函数

时间:2016-04-16 17:50:16

标签: c++ class constructor const

我有一个C ++课程,说“客户”,我希望有一个ID的成员,

private:
const string x; // Customer's ID

现在普通的构造函数看起来像这样:

Customer::Customer(const string& ID): x(ID){}

现在,我想构建一个默认构造函数,而不是初始化x。可能吗?因为如果我将它初始化为某个随机值,说“无标题”,那么我就不能再改变它,因为它是一个常量。

所以我根本不应该构建一个默认构造函数,或者是否有可能构建一个不初始化x的构造函数,以后可以这样做?

2 个答案:

答案 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");