事实上,复制构造函数应该,imho,总是以const引用作为参数。
X(X& rhs) { } // does not modify rhs
这不允许复制常量对象,因此下面的代码不会编译。 虽然非const对象可以作为常量参数,倒过来是不可能的
X const test;
X new_x(test);
我不能想象为什么有人要排除一个const对象的副本。
关于您想要进行的更改: 复制构造函数是否依赖于非const定义的任何X成员函数?
这工作就像一个魅力,但允许复印const对象:
class X
{
private:
int a;
public:
X(X &rhs) { a = rhs.value(); }
int& value (void) { return a; }
};
下一个示例将无法编译,因为rhs
是常量,但value()
不是常量。
class X
{
private:
int a;
public:
X(X const &rhs) { a = rhs.value(); }
int& value (void) { return a; }
};
如果你想让你的类的常量正确,你可能需要检查整个类。 它应该只会影响您的课堂实施。因为我不知道外部代码应该依赖于类成员函数的“非常量”的情况。 除非我的例子中的任何公共成员函数返回非const引用。
以下代码片段将按照预期执行。
class X
{
private:
int a;
public:
X(int const &b) : a(b) { }
X(X const &rhs) { a = rhs.value(); }
int const & value (void) const { return a; }
};
但要知道,这将像任何干扰代码:
X test(100);
test.value() = 12;
此使用int& value (void) { return a; }
会工作,但失败int const & value (void) const { return a; }
。 你当然可以提供两个安全的方面。
我可以看到我的问题已被轻微误解。我不问如何重写复制构造函数,我的问题是在给定使用类X的大量代码时是否存在任何危险。此代码是由完全不知道const并且正在使用编译器不关心。现在在移植到一个新的编译器时,我剩下的代码不能编译,并且我不能在STL中使用类。 – john 2013-04-22 17:15:55