$ 12.8 / 2 - '非模板构造函数 对于类X,是一个复制构造函数if 它的第一个参数是X&类型, const X&,volatile X&或const 易变的X&和,或者没有 其他参数或其他所有参数 参数有默认参数 (8.3.6)0.106)'
到目前为止,我还没有遇到任何需要使用其他默认参数声明复制构造函数的情况。
想知道任何带有多个参数的复制构造函数的实时使用。
答案 0 :(得分:11)
旧std::basic_string
也有一个:
basic_string(const basic_string& s,
size_type pos = 0, size_type n = npos)
答案 1 :(得分:10)
The BDE allocator [PDF Link]使用了这个怪癖。例如,他们的数组分配器看起来像这样:
template <typename T>
class bde::Array {
public:
Array(bde::Allocator *allocator = 0);
Array(const Array &rhs, bde::Allocator *allocator = 0);
};
答案 2 :(得分:3)
非常酷。看起来是将提示传递给复制构造函数的好方法。我可以想到一些可能有用的示例情况:
复制数据结构,然后使用其他数据填充副本
附加参数提示可能很快就需要优化分配的容量。默认容量将是一个标记值,表示只使用默认容量或原始数据结构的容量。
是否执行成员值的深拷贝或浅拷贝
默认情况下可能是为了安全而进行深层复制,但高级用法可以利用指定何时可以安全地进行浅层复制。
逐字复制与逻辑副本
提示数据结构的复制构造函数是应该逐字复制原始数据结构的内部结构,还是安全地优化或合并它。例如,提示可能表示树在复制时应该是平衡的。
答案 3 :(得分:0)
我有一种情况,我要求复制构造函数在我的一个涉及深层复制的类中有多个参数。
基本上问题是对象包含需要通过指针跟踪它的另一个对象,但普通的深拷贝只会复制指针值而不是新对象的正确内存位置。
通过禁用普通复制构造函数并使用带有两个参数的变量,我能够正确地深度复制我的对象。
[编辑]:查看我的代码似乎比我更常见,因为我在其他地方的几个地方也使用它。
这是一个好奇的代码示例(这是一个简化的版本,实际上有点复杂)
//-----------------------------------------------------------------------------
scan_point::scan_point(scan_point const& rhs, simulation* sim_)
: m(rhs.m), sim(sim_)
//-----------------------------------------------------------------------------
{
}
-
simulation_(simulation_ const& rhs)
{
//...
for(typename ContainerType::const_iterator it = rhs.spContainer->begin(), endIt = rhs.spContainer->end();
it != endIt; it++)
{
spContainer->push_back(new scan_point(*it, this));
}
}
-
为了减少复制过程中的麻烦,我使用了允许深层复制的smart_ptr类,并且(在这种情况下具体地说)将我的成员嵌入到一个struct中,使编译器为所有其他成员自动生成复制(请参阅试用举一个简短的例子:https://stackoverflow.com/questions/469696/what-is-your-most-useful-c-c-utility/1609496#1609496)。