Почему амперсанд используется в конструкторе копирования?

Почему мы передаем объект класса по ссылке. Когда убираю амперсанд (&) Я получаю следующую ошибку.

"Copy constructor of class A may not have parameter of type A"

Что это значит? может быть, компилятор не рассматривает данный конструктор копирования и использует конструктор по умолчанию. Если это так, почему вызывается конструктор по умолчанию. Короче почему мы используем амперсанд и что будет? если мы этого не сделаем.

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;
}

-1

Решение

В 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);

Как компилятор может заставить это работать? Если он использует конструктор копирования по умолчанию, то зачем ему вообще вызывать мой конструктор? И если он использует мой конструктор, как он предотвращает a.m от увеличения (что явно неправильно, a не должно быть изменено, когда оно передается по значению), учитывая, что нет кода, чтобы дать конструктору свою собственную копию?

4

Другие решения

Представьте, что произойдет, если вы этого не сделаете:

1) Теперь параметр передается по значению в конструктор копирования

2) Чтобы передать его по значению, он вызывает конструктор копирования.

3) Перейти к 1

4

Это конструктор копирования, который вызывается, когда вы передаете объект по значению.
Итак, если ваш конструктор копирования требует, чтобы экземпляр был скопирован до его запуска, как он вообще сможет работать?

Амперсанд приказывает передать его по ссылке, поэтому копия не создается.

1

Существует три способа передачи переменных в функции / методы в C ++: передача по значению, передача по адресу и передача по ссылке (которая фактически передается по адресу в красивой оболочке). Передача по адресу и передача по ссылке являются самыми простыми в том, что то, что передается в базовую функцию / метод, на самом деле является адресом памяти, где находится объект, который вы передаете. Для того, чтобы передать по значению, однако, копия из исходного объекта должны быть сделаны. Это работа конструктора копирования.

Чтобы конструктор копирования мог принять пример A, вы должны быть в состоянии сделать копию A, для чего требуется конструктор копирования, рекурсивное требование.

1
По вопросам рекламы [email protected]