为什么在复制构造函数中使用&符号?

use*_*712 -1 c++ constructor copy-constructor default-copy-constructor

为什么我们通过引用传递类的对象.当我删除&符号(&)时出现以下错误.

"Copy constructor of class A may not have parameter of type A"
Run Code Online (Sandbox Code Playgroud)

这是什么意思?可能是编译器没有考虑给定一个复制构造函数并使用默认值.如果是这种情况,为什么要调用默认值.简而言之,为什么我们使用&符号会发生什么?如果我们不这样做.

class A
{
public:
    A()
    {

    }



    A(A& tmp)
    {
        id = 2*tmp.id;
    }

public:
    int id;
};


int main()
{
    A obj;
    obj.id = 10;

    A obj1(obj);  
    cout << obj1.id;
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*mpt 5

想象一下如果你不这样做会发生什么:

1)现在,参数通过值传递给复制构造函数

2)为了按值传递它,它调用复制构造函数

3)转到1


Dav*_*rtz 5

在 C++ 中,函数可以通过值或引用来获取它们的参数。如果他们按值获取参数,则该值必须是可复制的。如果复制构造函数可以按值获取其参数,那么您将需要一个复制构造函数将其参数传递给它,这将导致无限循环。

考虑:

class MyInt
{
    int m;

public:

    MyInt(int i)
    {
        m = i;
    }

    MyInt(MyInt j)
    {
          j.m++;
          m = j.m;
    }
};

MyInt a(1);
MyInt b(a);
Run Code Online (Sandbox Code Playgroud)

编译器如何使这个工作?如果它使用默认的复制构造函数,那么它为什么需要调用我的构造函数?如果它使用我的构造函数,它如何防止a.m递增(这显然是错误的,a在按值传递时不应更改),因为没有代码可以为构造函数提供自己的副本?