다음을 통해 공유


참조 형식에 대 한 C++의 스택 의미

Visual C++ 2005 이전 참조 형식의 인스턴스는 사용 하 여 만들 수 있는 new 개체에서 가비지 생성 하는 연산자를 수집 힙.그러나 이제 스택에 네이티브 형식의 인스턴스를 만드는 데 사용 하는 동일한 구문을 사용 하는 참조 형식의 인스턴스를 만들 수 있습니다.따라서 사용할 필요가 없는 ref new, gcnew(C++ 구성 요소 확장) 는 참조 형식의 개체를 만들 수 있습니다.한 개체가 범위에서 벗어날 때, 컴파일러는 개체의 소멸자를 호출 합니다.

설명

스택의 의미론을 사용 하는 참조 형식의 인스턴스를 만들 때 컴파일러는 가비지 수집 된 힙에 내부적으로 인스턴스 만들지 않습니다 (사용 하 여 gcnew).

함수 함수 시그니처 나 반환 형식을 값으로 참조 형식의 인스턴스를 포함 하는 경우 메타 데이터 (modreq)에 특수 한 처리를 필요로 하는으로 표시 됩니다.현재이 특수 처리 되어 클라이언트가 Visual C++;에 제공 다른 언어 소비 함수 또는 스택 의미론을 통해 만든 참조 형식을 사용 하는 데이터를 현재 지원 하지 않습니다.

사용 하는 이유 gcnew (동적 할당) 형식에서 소멸자가 되지 않은 경우 스택 대신 의미가 됩니다.또한 스택 의미에서 함수 시그니처를 사용 하 여 만든 참조 형식을 사용 하 여 Visual C++ 이외의 언어에서 사용 하는 함수를 원하는 경우 그렇게 할 수 없습니다.

컴파일러에서 참조 형식에 대 한 복사 생성자를 생성 합니다.따라서 값으로 참조 형식 시그니처에서 사용 하는 함수를 정의 하는 경우 참조 형식에 대 한 복사 생성자를 정의 해야 합니다.참조 형식에 대 한 복사 생성자는 다음과 같은 형식의 서명이: R(R%){}.

참조 형식에 대 한 기본 대입 연산자는 컴파일러 생성 되지 않습니다.할당 연산자 스택의 의미론을 사용 하 여 개체를 만들고 스택 의미 체계를 사용 하 여 만든 기존 개체를 초기화할 수 있습니다.할당 연산자는 참조 형식에는 다음과 같은 형식의 서명이: void operator=( R% ){}.

형식의 소멸자에서 중요 한 리소스를 해제 하 고 참조 형식에 대 한 스택 의미 체계를 사용 하면 소멸자를 명시적으로 호출할 필요가 없습니다 (또는 전화 delete).참조 형식에서 소멸자에 대 한 자세한 내용은 Visual C++의 소멸자 및 종료자.

일반적인 표준 c + + 규칙 다음 사항이 추가 컴파일러가 생성 한 할당 연산자를 수행 합니다.

  • 형식이 참조 형식에 대 한 핸들 인 구성원이 될 모든 비정적 데이터 복사 (포인터 형식이 비정적 데이터 멤버와 같이 취급) 약식.

  • 형식이 값 형식 얕은 될 모든 비정적 데이터 멤버를 복사 합니다.

  • 참조 유형 복사 생성자를 호출 하는 참조 형식의 인스턴스 형식이 비정적 데이터 멤버를 호출 합니다.

또한 컴파일러를 제공은 % 해당 핸들 형식의 내부 스택 의미를 사용 하 여 만든 참조 형식의 인스턴스로 변환 하는 단항 연산자입니다.

다음 참조 유형 스택 의미 체계를 사용할 수 없습니다.

예제

ms177191.collapse_all(ko-kr,VS.110).gif설명

다음 코드 예제에서는 스택 의미 있는 참조 형식의 인스턴스를 선언 하는 방법을 보여 줍니다 어떻게 대입 연산자와 복사 생성자와 스택 의미 체계를 사용 하 여 만든 참조 형식과 추적 참조를 초기화 하는 방법을 합니다.

ms177191.collapse_all(ko-kr,VS.110).gif코드

// stack_semantics_for_reference_types.cpp
// compile with: /clr
ref class R {
public:
   int i;
   R(){}

   // assignment operator
   void operator=(R% r) {
      i = r.i;
   }

   // copy constructor
   R(R% r) : i(r.i) {}
};

void Test(R r) {}   // requires copy constructor

int main() {
   R r1;
   r1.i = 98;

   R r2(r1);   // requires copy constructor
   System::Console::WriteLine(r1.i);
   System::Console::WriteLine(r2.i);

   // use % unary operator to convert instance using stack semantics
   // to its underlying handle
   R ^ r3 = %r1;
   System::Console::WriteLine(r3->i);

   Test(r1);

   R r4;
   R r5;
   r5.i = 13;
   r4 = r5;   // requires a user-defined assignment operator
   System::Console::WriteLine(r4.i);

   // initialize tracking reference
   R % r6 = r4;
   System::Console::WriteLine(r6.i);
}

ms177191.collapse_all(ko-kr,VS.110).gifOutput

98
98
98
13
13

참고 항목

참조

클래스 및 구조체(C++ 구성 요소 확장)