实际上,恕我直言,复制构造函数应该始终将 const 引用作为其参数。
X(X& rhs) { } // does not modify rhs
这不允许复制 const 对象,因此以下代码将无法编译。虽然非 const 对象可以用作 const 参数,但反过来是不可能的
X const test;
X new_x(test);
我无法想象为什么有人应该排除 const 对象的副本。
关于您要进行的更改:复制构造函数是否依赖于任何定义为非常量的 X 成员函数?
这将像一个魅力,但允许复制 const 对象:
class X
{
private:
int a;
public:
X(X &rhs) { a = rhs.value(); }
int& value (void) { return a; }
};
下一个示例将无法编译,因为rhs
它是 const 但value()
不是 const。
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; }
。为了安全起见,您当然可以同时提供两者。