请参阅 TC++PL 第 3 版的第 10.4.6.3 节"复制成员"
refer to section 10.4.6.3 "copying members" of TC++PL 3rd edition
这句话是什么意思?
默认的复制构造函数或默认的复制赋值复制所有的元素。如果无法完成此复制,则为错误尝试复制类的对象。
例如:
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
。
因为您没有为类中的构造函数指定访问修饰符,所以它们是私有的,因此从外部无法访问。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 访问类成员而不复制此变量或互斥变量
- std::ofstream 作为类成员删除复制构造函数?
- 正在复制具有未初始化成员的结构
- 直接初始化不可复制、不可移动的成员,而不使用聚合初始化
- 具有 STL 向量类型成员的类的复制内存
- 是否可以将不可复制的成员用作使对象不可复制的替代方法?
- 将C++浮点数组成员直接封送到 C#,而无需复制
- 在临时将成员带出时省略复制/移动
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- 类成员,而不复制
- Gcc 使用 memcpy 作为隐式复制赋值运算符,而不是成员复制
- 将对象及其数据成员复制到另一个对象
- Const 类成员复制构造函数
- c++特殊成员复制构造函数
- 如何将基类的私有成员复制到派生类的复制构造函数中
- 与类的成员复制混淆
- 复制构造函数- c++按位复制与按成员复制
- 将结构的成员复制到另一个结构