为什么复制构造函数只能使用引用参数?

时间:2015-01-25 07:18:39

标签: c++

我正在学习C ++,这是我第一次尝试理解复制构造函数的工作原理:

class Cents
{
private:
    int m_nCents;
public:
    Cents(int nCents=0)
    {
        m_nCents = nCents;
    }

    // Copy constructor
    Cents(  Cents cSource)
    {
        m_nCents = cSource.m_nCents;
    }
};

int main()
{
 Cents cMark(5); // calls Cents constructor
 Cents cNancy = cMark; // calls Cents copy constructor!
 return 0;
}

但是我收到了这个错误:

  

错误1错误C2652:' Cents' :非法复制构造函数:第一个   参数不能是' Cents'

我的复制构造函数有什么问题?

我检查过如果在构造函数中我通过引用传递参数,那么它编译得很好,但是我不会按照我正在做的方式工作。为什么会这样?

3 个答案:

答案 0 :(得分:4)

按值传递任何参数需要复制构造函数 - 显式或隐式。 当我们定义一个拷贝构造函数时,我们的意思是我们不想使用隐式拷贝构造函数。 使用为复制构造函数定义的复制构造函数将创建循环依赖。

答案 1 :(得分:3)

就像最后一个答案一样

如果您使用以下声明:

Cents c1 ;
Cents c2(c1) ;

或者按照这样的值将对象传递给函数:

void Func (Cents c) {}

int main() { 
    Cents c1 ;
    func (c1);
}

或使用赋值运算符初始化对象:

Cents c2 = c1 ;

编译器将搜索复制构造函数,它会发现Cents( cents csource)(您建议的复制构造函数)也按值传递对象。从技术上讲,要通过值传递,您要求编译器在函数体中创建对象的临时副本。因此,要求复制构造函数本身调用复制构造函数(这将是一个递归调用)不是逻辑

答案 2 :(得分:2)

  

我检查过如果在构造函数中我通过引用传递参数,那么它编译得很好,但是我不会按照我正在做的方式工作。为什么会这样?

您正在定义如何制作Cents 的副本。

必须 获取参考参数,因为如果您尝试按值获取该参数,则该值将是副本。

您的复制构造函数不能要求已定义的复制构造函数。