IT

C ++에서 복사 생성자가 참조로 변수를 승인해야하는 이유는 무엇입니까?

lottoking 2020. 8. 5. 07:39
반응형

C ++에서 복사 생성자가 참조로 변수를 승인해야하는 이유는 무엇입니까?


전달해야하는 매개 변수는?


참조가 아닌 경우 값에 의한 것이 때문입니다. 그렇게하여 비용을 복사하고 복사를 생성합니다. 그러나 그렇게하면 새로운 가치를 호출합니다.

"복사 할 확률이 높으므로 무한 재귀가 발생합니다."


값별 전달은 복사 생성 해 호출하기 때문에 :)


참조 별 전달의 대안은 값별 전달입니다. 값별 전달은 실제로 복사합니다. 사본을 만들려면 사본 생성자가 필요합니다.

복사 생성 호출하기 위해 복사를해야한다면 수수께끼입니다.

(나는 무한 재귀가 컴파일러에서 발견을 생각하며 그런 프로그램을 얻지 못할 것입니다.)

합리적인 이유 외에도 §12.8 / 3의 표준에 의해 금지되어 있습니다.

첫 번째 세대 변수가 (선택적으로 cv-qualified) X 유형이고 모든 변수에 기본 인수가있는 경우 X의 생성자 다른 클래스 형식입니다.


값으로 전달하면 무한히 재귀 적입니다.


내장 데이터 유형 (여기서는 자동차) 이외의 인수를 사용하는 함수 (예 : int f (car c))를 호출 할 때마다 호출자가 제공하는 한 실제 오브젝트를 호출 된 함수의 여러 변수에있는 변수에 복사해야합니다.
예 : 자동차 carobj; f (carobj);

즉, carobj를 c에 복사하십시오.

함수 f에서 매개 변수 c에 carobj를 처리해야합니다.

복사를 달성하기 위해 복사 생성자가 호출합니다.

이 경우, 전달 값을 사용하여 호출 된 함수 f, 즉 함수 f는 값을 전달합니다.

함수 f가 참조로 전달 널 선언은 int f (car & c);

이 경우 car carobj; f (carobj); 복사 생성자가 필요하지 않습니다.

이 경우 c는 carobj의 기본적으로 사용됩니다.

위의 두 시나리오를 사용하여 명확하게하기 위해 다음과 같이 요약합니다. 1. 조건에서 변수 생성을 선언의 값으로 선언합니다. 2. 매개 변수를 참조로 전달하도록 함수가 선언 된 경우, 매개 변수는 호출자가 제공합니다. 복사 생성자가 필요하지 않습니다!

이제 문제는 참조로 전달해야하는 이유입니다. 복사 생성 참조를 수신하면 수신 변수는 오브젝트의 별명이됩니다. 따라서 호출자 제공 생성자의 값을 인수 목록의 생성자 변수에 복사하기 위해 복사하기가 필요하지 않습니다.

즉, 이름이 전달하는 경우, 복사 생성자가 호출자 제공으로 생성자가 호출 한 값, 즉 값 전달하는 경우 객체의 복사 생성자가 필요합니다. 그 자체에서 호출자를 호출자에서 함수 자체 (이 경우 복사 할 호출자에서 함수)로 가져 오기 오려면 복사 변수를 호출해야합니다. 이것은 전달 생성자에 대한 참조를 전달하는 이유입니다.


전달하는 것이 매우 중요합니다. 호출가 값으로 복사 생성자에 전달 널 복사 생성자는 자신을 호출하여 실제 변수를 공식 변수에 복사합니다. 따라서 복사 생성자에 대한 끝없는 호출 체인이 시작됩니다. 이 프로세스는 시스템 메모리가 부족할 때까지 계속됩니다.

따라서 매개 변수는 항상 전달되어야합니다.


참조로 전달되지 않은 전달 값으로 전달됩니다. 인수가 값으로 전달 널 복사 생성자 요청 변수를 공식 변수로 복사하기 위해 자신을 호출합니다. 이 프로세스는 시스템 메모리가 부족할 때까지 계속됩니다. 따라서 복사 생성자가 호출하지 않도록 참조해야합니다.


값을 기준으로 생성을 전달하면 복사 생성자가 복사 할 때 생성되기 때문에 값이 아닌 참조로 전달해야합니다. 이 프로세스는 컴파일러가 실행될 때까지 계속 진행됩니다. 기억의.

참고 URL : https://stackoverflow.com/questions/2685854/why-should-the-copy-constructor-accept-its-parameter-by-reference-in-c

반응형