为什么复制构造函数对于不可变对象是不必要的?请为我解释一下。
答案 0 :(得分:11)
因为值不能改变,所以在所有情况下引用相同的对象都是好的,没有必要有“额外的副本”,可以这么说。
答案 1 :(得分:4)
这是一个语言相关的问题,特别是关于生命周期。暂时让我们忘掉那些。
复制构造函数很有价值,因为它们允许您获取一个对象并创建一个完全独立的副本。这很有价值,因为您现在可以独立于第一个对象修改第二个对象。或者组件可以创建私有副本以保护自己免受其他组件的影响,从而将对象从其下面更改。
不可变对象不可更改。创建不会更改的对象副本没有任何价值。
现在再说一次关于生命的事情。在像C ++这样的语言中,复制构造函数还允许您解决内存/生命周期问题。例如,如果我正在编写一个采用SomeType*
的API,并且我希望将其保留的时间长于我的方法的生命周期。在C ++中,最可靠的方法是通过复制构造函数创建对象的副本。
答案 2 :(得分:2)
这在某种程度上取决于语言:
但是,许多语言都需要复制构造函数。如果您不提供,语言将隐式生成一个。
但是,对于不可变对象,这通常很好,因为默认的复制构造函数(通常)会对所有值执行浅表复制。使用可变数据类型(即:包含对其他对象的内部对象引用),浅复制通常是一个糟糕的选择,因为复制只复制封装在其中的引用/指针。
答案 3 :(得分:1)
它是如此自然,因为不可变对象的值不能改变。