2011-06-10 155 views
4

我在开源库中编程,在代码中只有很少的注释,并且绝对没有代码相关的文档,或者显示完全没有或完全混淆的注释。一个例子类的库有时被定义如下(这是一个抽象简单的例子):私人拷贝构造函数:disallow

class A 
{ 
    private: 

    // Disallow default bitwise copy construct. 
    A (const A& Acopy) { data = Acopy.data; }; 

    int data; 

    public: 

    A() {}; 

    A (int arg) : data(arg) {}; 

    A(const A& Acopy) { data = Acopy.data; }; 

}; 

私人拷贝构造函数的前“Dissalow默认按位拷贝构造”的评论就指出这样一个事实当我定义一个类型时,我需要定义我自己的拷贝构造函数,以避免编译器为我“模糊生成”一个拷贝构造函数。这是我迄今在这个主题上学到的。但在这种情况下,构造函数是private,并且编译以此形式中断。

问:是否有这样的理由?一个私人的复制构造函数?这个评论意味着什么?

托米斯拉夫

回答

9

这意味着你说的非常多。通常,编译器会生成一个拷贝构造函数。为了防止这种情况,你可以定义你自己的,并将其设为私人。然后,在编译时复制构造类的任何尝试都会失败,而不是默默地做错误的事情。

+2

通常,复制构造函数只是声明为私有的,并未实现,赋值运算符接收相同的处理。罕见的情况是你不想公开复制构造函数,但私人构造函数是有意义的。 – AProgrammer 2011-06-10 07:57:18

+0

如果我定义了任何拷贝构造函数** private **或** public **,编译器将不会生成一个。如果编译器被赋予一个引用而不是一个值作为参数,它将采用引用而不是值。如果它是私人的,它不能从课外被调用,其中两个可能不存在。这是否意味着类的模板是这样写的,以迫使程序员定义他自己的公共副本(或私人)构造函数? – tmaric 2011-06-10 08:02:30

+1

不,当这样写时,它是*防止*课程被复制*完全*。一旦存在复制构造函数,就不能创建第二个构造函数。如果它是私密的,那么它实际上意味着该类不能被复制。 – jalf 2011-06-10 08:06:27

2

通常,一个拷贝构造函数是由私人通过值来禁止对象的传递。

2

我认为编译打破了,因为复制构造函数被定义了两次,一次是私有的,一次是公有的。

私有拷贝构造函数的原因可能是为了防止A的实例被值传递或返回。为什么要这样做是另一回事,我无法回答。

2

正如你所说,要避免生成默认拷贝构造函数,但不仅仅是 - 它是private以避免实际使用它。让它变得私密的一点是不允许使用它。

0

因为您有两个复制构造函数,一个是公共的,一个是私有的,所以编译会中断。私人复制卖家完全没问题。他们不允许用户可以做许多危险的事情。