首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++默认复制构造函数

C++默认复制构造函数
EN

Stack Overflow用户
提问于 2010-10-03 23:08:52
回答 4查看 773关注 0票数 4

我知道如果copy ctor在类中声明为private,编译器将不会生成默认的copy ctor。

但是有人能解释一下为什么编译器会这样做吗?

如果copy ctor声明为protected,会发生什么情况?编译器会提供默认的复制ctor吗?

如果copy ctor声明为private,但有一个定义,如foo(const& obj){}

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-03 23:15:39

类中声明的任何复制构造函数(无论是私有的、公共的还是受保护的)意味着编译器不会生成默认的复制ctor。然后类中声明的代码是否也被定义,或者不仅控制具有适当可见性的代码是否可以复制类的实例(如果没有定义,链接器将会抱怨;编译器的工作只是抱怨没有适当可见性的使用,而不是复制链接器的工作)。

例如,如果您声明了一个私有的复制ctor,那么如果它试图复制一个实例,则只允许编译类中的函数中的代码(当然是朋友)。如果没有定义ctor,那么该代码将无法在链接器中幸存下来,因此您无论如何都会得到一个错误(只是不幸的是,在构建过程中稍晚一点,即与较早检测到的错误相比,在构建时可能会适度浪费计算资源)。

票数 5
EN

Stack Overflow用户

发布于 2010-10-03 23:11:19

编译器知道存在复制构造函数,所以它不会生成一个。此阶段不考虑可访问性(公共/私有/受保护)或是否有定义。

听起来好像没有拷贝构造函数,只是因为你不能从外部和非好友调用私有函数。用户定义的构造函数仍然存在,只是它是私有的。

如果它是受保护的,那么只有子类和它自己可以调用复制构造函数。也不会有隐式定义的复制构造函数。

票数 3
EN

Stack Overflow用户

发布于 2010-10-03 23:18:04

$12/1 -“默认构造函数(12.1)、复制构造函数和复制赋值运算符(12.8)以及析构函数(12.4)是特殊的成员函数。[注意:当程序没有显式声明某些类类型时,实现将为某些类类型隐式声明这些成员函数。如果使用它们,实现将隐式定义它们。...”

因此,在复制构造函数被显式声明的情况下,编译器将其视为具有定制复制构造函数的意图,并且隐式复制构造函数的生成被抑制。

复制构造函数可以声明并定义为私有。如果复制构造函数被定义为私有,则复制初始化/直接初始化将不会工作,如下所示。

代码语言:javascript
复制
struct A{
    A(){}
private:
    A(A const &){}
};

int main(){
    A a1;
    A a2(a1);  // direct initialization, error

    A a3 = a1; // copy initialization, error
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3850284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档