변수가 데이터 유형의 인스턴스라고 말하는 것이 맞습니까?


9

(프로그램 과정에서 가치를 변경할 수 있음)

아니면 '무엇의 인스턴스'가 클래스와 객체와 엄격하게 관련되어 있습니까? 그렇다면 C ++에서 'variable'이라는 개념을 어떻게 정의 하시겠습니까?


C #과 Java는 두 가지 흥미로운 점에서 C ++과 다릅니다. 먼저 C ++은 그렇지 않은 반면 기본 유형을 객체 (및 구조체) 유형으로 통합하려고 시도하지만 int 인스턴스에 대해 이야기 할 수 있습니다. 둘째, C # 및 Java에서 객체 유형의 변수 는 힙의 인스턴스 (클래스)에 대한 암시 적으로 참조 되며 객체에 대한 포인터에 대해서는 언급하지 않지만 C ++에서는 @coredump의 답변과 같은 객체 유형의 로컬 변수 스택의 인스턴스에 대한 바인딩이며 객체와 객체에 대한 포인터를 명시 적으로 구분합니다.
Erik Eidt

답변:


8

내가 아는 한, 해당 유형 의 기본 유형 인스턴스 값을 호출하는 것이 정확 합니다 (예를 들어 Visual Studio 매뉴얼에서 "C ++ Type System" 참조 하지만 여전히 다른 소스를 찾고 있습니다). 주로 물체를 토론 할 때 사용됩니다. 클래스 C 또는 해당 서브 클래스 중 하나에 정의 된 생성자에서 작성된 오브젝트는 클래스 C의 인스턴스입니다.

C ++의 변수는 런타임 개념이 아닙니다. 변수 이름과 추상 (구성되지 않은 경우 변경 가능) 위치 사이의 어휘 바인딩으로 컴파일러 내부에 존재합니다. 프로그램이 컴파일되면 변수는 더 이상 존재하지 않습니다. 대신, 레지스터, 메모리 등에서 데이터를 읽고 씁니다.


2
" 기본 유형의 값은 일반적으로 해당 유형의 인스턴스라고 말하지 않으며 객체와 클래스에 예약되어 있습니다. "전혀 사실이 아닙니다. 표준에는 개체로 간주되지 않는 기본 유형의 값이 없습니다. 변수의 정의는 사용자 정의 클래스인지 또는 기본 유형인지에 따라 어떤 식으로도 변경되지 않습니다.
Nicol Bolas

@NicolBolas 나는 누군가가 C ++의 맥락에서 정수를 무언가의 인스턴스로 언급하는 것을 들은 적이 없으며 표준에서 명시 적으로 언급하지 않더라도 아무 것도 인스턴스 가 아니라고 말하는 것이 옳습니다 . 그렇지 않다면, 그것들은 무엇입니까? 또한이 답변이 변수의 정의가 기본 유형과 객체간에 변경된다고 주장하는 곳을 보지 못했습니다. "인스턴스"는 단순히 변수의 정의와 아무 관련이 없다고 주장하는 것처럼 보입니다.
Ixrec

2
@Ixrec : " 그렇지 않은 경우의 그들이 인스턴스 무엇? "유형은 int. C ++ 표준은 변수 선언의 기능에 대해 이야기 할 때 기본 형식과 기본이 아닌 형식을 구분하지 않습니다. 따라서 어떤 유형이 되든지간에 T t;유형의 객체를 선언 합니다. TT
Nicol Bolas

1
@Ixrec : 리터럴 은 다른 종류입니다. 리터럴은 일종의 prvalue입니다. 그러나 리터럴 변수를 만들 수 없으므로 다른 토론입니다.
Nicol Bolas

5

아니면 '무엇의 인스턴스'가 클래스와 객체와 엄격하게 관련되어 있습니까? 그렇다면 C ++에서 'variable'이라는 개념을 어떻게 정의 하시겠습니까?

C ++에서 가능한 한 간결하게 작성하려면

  • 변수 A는 이름 A의 (코드) 의 메모리 위치 런타임에 결정되어야한다.
  • 인스턴스객체 메모리에 상주 런타임.

분명히하기 위해 :

  • 모든 메모리 영역에 객체가있는 것은 아닙니다. 예를 들어, 일부 메모리 영역에는 '쓰레기'값이 포함될 수 있습니다.
  • 모든 메모리 저장 객체에 코드 이름이 부여 된 것은 아닙니다. 객체는 배열의 위치 또는 포인터가 참조 하는 의 위치와 같은 명명되지 않은 메모리 영역에있을 수 있습니다 .
  • 메모리 영역에 가비지가 포함되어 있으면 일반적으로 해당 위치에서 객체가 초기화되지 않았거나 기존의 일부 객체가 손상 되었기 때문입니다.

1
POD는 C ++의 객체입니다. 모든 메모리 영역이 객체는 아니지만 POD는 단순한 메모리 영역이 아닙니다.
Nicol Bolas

1
두 번째 NicolBolas : POD는 객체입니다. 그러나 새로 malloc()'하지만 초기화되지 않은 버퍼 에 대해 이야기 할 때 중요한 점은 아직 객체가 아닌 메모리 영역입니다. 마찬가지로, 명시 적으로 파괴 된 객체 : 더 이상 객체가 아닌 메모리 영역입니다.
cmaster-monica reinstate

@NicolBolas 공정한 의견, 나는 그 표현을 약간 변경했습니다
Ben Cottrell

1

"올바른"은 무엇을 의미합니까?

우리가 그것에 대해 매우 엄격하고 싶다면 다음을 구별해야합니다.

  • 구문 : 사이드 표현 정적 유형
  • 의미론 측 : 오브젝트 있는 인스턴스클래스

따라서 표현식 인 변수 는 유형을 습니다. 그 가치 (참조하는 객체)는 어떤 클래스의 인스턴스가 될 것입니다. 변수의 유형과 객체의 클래스는 일반적으로 같은 것이 아닙니다. 변수의 정적 유형은 객체의 런타임 클래스에 상한 을 두므로 클래스는 유형 에 해당하는 클래스 의 하위 유형 이어야합니다 .

당신은 항상 그 큰 입을 반복하고 싶습니까? 도대체 우리가 말하고 싶은 것과 엄격하게 말하는 것은 상황에 달려 있습니다. 종종 "변수는이 유형의 인스턴스입니다"라고 말하는 데 아무런 문제가 없습니다. 실제로 발생하는 것은 객체와 런타임 클래스의 슈퍼 클래스를 참조하기 위해 변수와 유형을 간결하게 사용하고 있다는 것입니다.


1

평생을 순수주의와 sophism으로 보내고 싶지 않다면 ... 그렇습니다.

고유하게 식별 된 무언가를 유지할 때마다 인스턴스화하는 다른 고유하게 식별 가능한 것을 위조 하는 용도로 사용됩니다 .

  • 프로젝트를 제품으로 인스턴스화
  • 소스를 실행 파일로 인스턴스화
  • 템플릿은 유형으로 인스턴스화됩니다.
  • 변수로 인스턴스화되는 유형입니다.

이러한 인스턴스화 중 일부 는 더 정확한 이름을 가질 수 있지만 일반적으로 이것이 작동합니다.


0

많은 사람들이 수업 인스턴스에 대해 "인스턴스"를 예약합니다. 그렇게하면 C ++에서 변수는 클래스의 인스턴스, 인스턴스에 대한 참조, 인스턴스에 대한 포인터 또는 기본 유형이 될 수 있습니다 (해당 컨텍스트에서 구조체를 클래스로 계산할 가능성이 높습니다) 완전히 동일). Java 또는 Objective-C에서 변수는 인스턴스가 아니며 인스턴스에 대한 참조 일 수 있습니다.

Forgot : 짧은 시간 동안 C ++ 포인터는 생성자 실행을 시작하기 전에 "this"와 같이 원시 메모리에 대한 포인터가 될 수 있습니다. 지금은 *이 인스턴스를 아직 호출하지 않았을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.