这句话是什么意思?
默认的复制构造函数或默认的复制赋值复制所有的元素。如果无法完成此复制,则为错误尝试复制类的对象。
例如:
class unique_handle{
unique_handle(const unique_handle&);
unique_handle&operator=(const unique_handle&);
public ://...
};
struct Y {
unique_handle a;
}//require explicit initialization
Y y1;
Y y2=y1; //error:cannot copy Y::a
如果您的类包含一个无法复制的元素(unique_handle
有一个私有的复制构造函数,所以它确实无法复制),那么按元素复制是不可能的。
默认的复制构造函数或默认的复制赋值复制类的所有元素。
这里的"违约"是一种非传统的"隐含定义"的说法。
由于类Y
没有声明复制构造函数(即构造函数Y(Y&)
或Y(Y const &)
),因此一个是隐式声明的。当您尝试使用它时,隐式定义来复制Y
的所有基类对象和成员(在本例中仅为一个成员),就好像您编写了以下内容一样:
Y::Y(Y const &other) : a(other.a) {}
如果无法完成此复制,则尝试复制类的对象是错误的。
但是,只有当所有成员都可以复制时,才能定义此构造函数。在这种情况下,unique_handle
有一个私有的复制构造函数,不能从此构造函数调用它。
类似地,由于Y
没有声明复制赋值运算符(即operator=(Y&)
或operator=(Y const&)
),因此再次隐式声明一个。如果你试图使用它,那么它将被简单地定义为分配所有成员,就像你写的那样:
Y & Y::operator=(Y const & other) {
a = other.a;
return *this;
}
由于unique_handle
具有专用拷贝分配运算符。
class
成员默认为private
,struct
成员默认为public
。
因为您没有为类中的构造函数指定访问修饰符,所以它们是私有的,因此从外部无法访问。