2013-11-26 2 views
2

나는 기본적인 CPU 에뮬레이터에서 약간의 C++ 코드를 읽고 있었다 난 그냥이를 이해할 수 없다 : Ampersand & with const in constructor : 인수가없는 인수가있는 개인용 사본 생성자입니까?

class CPU { 
private: 
    CPU (const CPU&){} 
}; 

내가 포인터를 이해

, 나는이를 확인했습니다. 분명히 그것은 (하드) 복사 생성자이지만 이해가 안됩니다. 어떻게 작동합니까? 왜 const? 왜 이름이없는 앰퍼샌드입니까? 왜 비공개인가? 내 책이나 cplusplus.com에서 이와 같은 예를 발견하지 못했습니다.

int foo(int var) { cout << var; } 
int bar(int &var) { cout << var; } 

foo는 바이 같은 일을 인쇄 : 보조 노트에

? 바는 근본적으로 * & var?

도움을 주시면 감사하겠습니다. 당신은 당신이

  • 앰퍼샌드를 복사하는 객체를 수정하지 않기 때문에

  • 답변

    1

    &은 인수 정의에서 사용될 때 참조로 전달됨을 나타냅니다. 인수를 포인터로 변환하고 함수 범위 내에서 포인터를 사용하면 해당 포인터의 참조를 해제합니다. 두 번째 질문에서 두 기능 모두 똑같은 것을 인쇄합니다. &은 함수 헤더에 복사하는 대신 참조로 원래의 객체를 전달한다고 간단하게 말합니다. 동일한 내용이 존재하지만 유일한 차이점은 함수 중 하나가 전체 입력을 복사하고 다른 하나는 원할 경우 소스 변수를 편집 할 수 있다는 것입니다.

    CPU (const CPU&){}은 생성자가 CPU 개체에 대한 지속적인 참조가 필요하다고 말하고 있습니다. 이는 CPU의 const 함수에만 액세스 할 수 있다는 것을 의미합니다. 원래 CPU 객체 인수는 변경하지 않습니다. CPU& 뒤에 이름이 없으면 현재 범위 내의 이름에 변수를 할당하지 않는다는 것을 의미합니다 (정의 뒤의 괄호는 인수를 무시합니다).

    생성자가 비공개 인 경우 일반적으로 개체를 생성하는 다른 함수가 있음을 의미합니다. 팩토리는 종종 객체 생성자를 숨기고 객체를 만들기 전에 다른 속성/등록을 요구합니다.

    +0

    개인 복제 생성자를 사용하여 인스턴스 수를 제어하고 인스턴스 복사를 방지 할 수 있습니까? 흥미 롭 군. 감사. – ShadoWalkeR

    0
    1. CONST 만 이름이 아닌 사항을 입력 때문에 인수를 이름, 메서드 선언에서 허용되지 않습니다
    2. 참조를 의미

    마지막으로 비공개 -이 코드는 다른 클래스의 복사본 생성자를 단순히 "숨기"때문에 "나를 복사하지 마십시오"라는 의미입니다.

    3

    이 아닙니다. 여기서 작동 단어는 private입니다. 이 전체 구문이하는 일은 멤버 함수에서 호출 할 수있는 복사 생성자를 생성하여 해당 동작을 효과적으로 비활성화하는 것입니다. 일반적으로 사람들은 함수 본문을 생략하여 멤버 함수에서 호출 한 경우 링크 오류가 발생합니다.

    CPU x; 
    CPU y(x); // this is the one that matches the parameters 
    

    당신은 컴파일러 오류를 얻을 것이다 당신이 아니니까 : 당신이 실제로 그것을 유도하기 위해 시도하는 경우

    C++ 11 용어에서

    CPU(const CPU&) = delete; 
    

    로 구현된다 멤버 함수를 호출하지만 private 함수를 호출하려고합니다.

    이유는 그들이 기능을 사용하지 않기를 원하기 때문입니다. 복사 생성자를 사용하여 이러한 개체 중 하나를 만들 수 없습니다.

    "const CPU &"은 "const CPU에 대한 참조"를 의미합니다. 함수가 변수를 참조하지 않기 때문에 변수 이름을 남겨 두는 것은 유효하지만 인수는 패턴과 일치해야합니다.

    +0

    사실, 다른 CPU 메소드가 복사 생성자를 사용하는 경우 '작동 할 수 있습니다.' – Pyrce

    +0

    @Pyrce : 일반적으로 본문이 정의되지 않은 이유입니다. 실수로 사용하면 링커 오류가 발생합니다. 그러나 그 이유는'= delete'은 정의하지 않는 것을 기억할 필요가 없으므로 더 좋습니다. –

    +0

    그것이 작동하지 않는다는 것이 무엇을 의미합니까? 그것은 기존 프로젝트의 코드 인 것처럼 보입니다. 대부분의 C++ 프로젝트는 여전히 C++로 작성되어 가장 좋은 경우입니다. 여기서는 다른 클래스에서 복사 생성자를 숨기는 방법입니다. –

    0

    이것은 (실수로) 클래스 인스턴스의 사본을 e.q에서 만들지 못하도록하는 방법입니다. 함수에 전달 :

    CPU foo; 
    void f1(CPU &foo) {}; f1(foo); // work 
    void f2(CPU *foo) {}; f2(&foo); // work 
    void f3(CPU foo) {}; f3(foo); // fails 
    

    것은 그래서 당신은 값 기능에 의해 전화에 붙여 넣을 수 없습니다.