$12.8/2 - '如果类 X 的第一个参数的类型为 X&、const X&、volatile X& 或 const volatile X&,并且没有其他参数或所有其他参数都具有默认值,则类 X 的非模板构造函数是复制构造函数论据(8.3.6).106)'
到目前为止,我还没有遇到任何需要声明带有附加默认参数的复制构造函数的示例。
想知道任何实时使用这种带有多个参数的复制构造函数。
$12.8/2 - '如果类 X 的第一个参数的类型为 X&、const X&、volatile X& 或 const volatile X&,并且没有其他参数或所有其他参数都具有默认值,则类 X 的非模板构造函数是复制构造函数论据(8.3.6).106)'
到目前为止,我还没有遇到任何需要声明带有附加默认参数的复制构造函数的示例。
想知道任何实时使用这种带有多个参数的复制构造函数。
旧的std::basic_string
也有一个:
basic_string(const basic_string& s,
size_type pos = 0, size_type n = npos)
BDE 分配器[PDF 链接] 使用了这个怪癖。例如,他们的数组分配器看起来像这样:
template <typename T>
class bde::Array {
public:
Array(bde::Allocator *allocator = 0);
Array(const Array &rhs, bde::Allocator *allocator = 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 类,并且(在这种情况下,特别是)将我的成员嵌入到一个结构中,以使编译器为所有其他成员自动生成复制(请参阅简短的尝试例如:https ://stackoverflow.com/questions/469696/what-is-your-most-useful-cc-utility/1609496#1609496 )。