C++ 参考第10.4.6.3节;“复制成员”;TC&x2B+;PL第三版

C++ 参考第10.4.6.3节;“复制成员”;TC&x2B+;PL第三版,c++,C++,这句话是什么意思 默认复制构造函数或默认复制分配复制所有 类的元素。如果无法复制,则为错误 尝试复制类的对象 例如: class unique_handle{ unique_handle(const unique_handle&); unique_handle&operator=(const unique_handle&); public ://... }; struct Y { unique_handle a; }//requi

这句话是什么意思

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

例如:

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\u handle
具有私有复制构造函数,因此确实无法复制),则不可能进行元素复制。

class
默认情况下成员为
private
struct
默认情况下成员为
public

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

默认复制构造函数或默认复制赋值复制类的所有元素

这里的“默认值”是一种非常规的说法“隐式定义”

由于类
Y
没有声明副本构造函数(即构造函数
Y(Y&)
Y(Y常量&)
),因此隐式声明了一个。当您尝试使用它时,它被隐式定义为复制
Y
的所有基类对象和成员(在本例中只有一个成员),就好像您编写了如下内容:

Y::Y(Y const &other) : a(other.a) {}
如果无法进行此复制,则尝试复制类的对象是错误的

但是,只有在可以复制所有成员的情况下才能定义此构造函数。在这种情况下,
unique\u handle
有一个私有副本构造函数,不能从此构造函数调用该构造函数

类似地,由于
Y
不声明复制赋值运算符(即
运算符=(Y&)
运算符=(Y常量&)
),因此再次隐式声明一个。如果您尝试使用它,那么它将被隐式定义为分配所有成员,就像您编写了:

Y & Y::operator=(Y const & other) {
    a = other.a;
    return *this;
}

这将再次失败,因为
unique\u handle
有一个私有的拷贝分配操作符。

请学习如何正确缩进代码,这样就不是了。