请参阅 TC++PL 第 3 版的第 10.4.6.3 节"复制成员"

refer to section 10.4.6.3 "copying members" of TC++PL 3rd edition

本文关键字:成员 复制 TC++PL 请参阅      更新时间:2023-10-16

这句话是什么意思?

默认的复制构造函数或默认的复制赋值复制所有的元素。如果无法完成此复制,则为错误尝试复制类的对象。

例如:

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成员默认为privatestruct成员默认为public

因为您没有为类中的构造函数指定访问修饰符,所以它们是私有的,因此从外部无法访问。