2010-01-05 2 views
2

이후 C++에서 모든 것이 C++로 나에게 미쳐 보인다. 난 그냥 궁금 우리가 C++로 인스턴스화 이런 종류가 왜 누군가가 나를 설명 할 수있는 경우 : 방법 1 :C++에서 인스턴스화하는 다른 유형

ClassA obj1; // this is going to stack 

방법 2 :

ClassA *obj1 = new ClassA(); //this is going to heap 

을 우리는 공통의 인스턴스화가없는 반면, C#을 C에 대한 방법 ++에서 :

ClassA obj2 = new obj2(); 

및 방법 항목에서 한 번 더 질문 I)는를 ClassA에서하지만 (없이 인스턴스를 얻고 이것은이다 내가 혼란스러워하는 정확한 장소, 왜 그렇게 instatiating해야합니까? ClassA에는 생성자가 있지만 괄호없이 인스턴스화 하시겠습니까 ??? 어떻게 생성자를 호출할까요?

p.s : 나는이 주제를 읽었습니다 :

Different methods for instantiating an object in C++

Stack, Static, and Heap in C++

What and where are the stack and heap?

+0

런타임에서 메모리를 관리하기 때문에 C#에는 두 가지 인스턴스화 방법이 없습니다. –

+0

방법 1에서 obj는 ClassA 개체에 대한 참조입니다. 방법 2에서 obj는 ClassA 객체에 대한 포인터입니다. C++의 새로운 기능은 할당 된 메모리에 대한 포인터를 반환합니다. 생성해야 할 객체의 유형을 새로 말해야합니다. 이것이 세 번째 옵션이 작동하지 않는 이유 중 일부입니다. obj2가 객체로 정의되지 않았습니다. 코드의 그 시점에서, 그것은 일단 생성 된 객체에 대한 참조를위한 식별자로 사용될 텍스트 일뿐입니다. – iheanyi

답변

3

Java 또는 C#과 같은 언어의 C++은 매우 어려울 수 있습니다.

가장 큰 차이점은 C++에서는 거의 항상 자신의 메모리를 관리한다는 점입니다. 힙에 객체를 생성 할 때 메모리를 누출하지 않도록 삭제해야 할 책임이 있습니다. 따라서 적절하다고 판단되면 삭제할 수 있습니다. 스택에 객체를 생성 할 때 객체가 범위를 벗어날 때 자동으로 삭제되므로 범위를 벗어나면 객체를 사용하지 않도록주의해야합니다.

예 :

void do_queue(B& queue) 
{ 
    Evt *e = new Evt; 
    queue.queueEvent(e); 
} // all well, e can be popped and used (also must be deleted by someone else!) 

상기 그게되고

void do_queue(B& queue) 
{ 
    Evt e; 
    queue.queueEvent(&e); 
} // e is out of scope here, popping it from the queue and using it will most likely cause a sigseg 

대, 두 가지 방법은 하나의 양태에서 크게 다르다 : 첫 번째 객체를 생성한다. 두 번째 것은 객체에 대한 포인터를 생성합니다. 포인터를 갖는 것에 대한 좋은 점은 스택에 복사되는 최소한의 메모리 (포인터가 전체 객체 대신 복사 됨)를 매개 변수로 전달할 수 있다는 것입니다. 물론 "&"을 사용하여 스택에 할당 된 객체의 주소를 가져 오거나 참조로 전달할 수 있습니다. 그러나 스택에 할당 된 객체를 사용할 때는 특히 범위를주의 깊게 살펴야합니다.

내가 C++ 자바에서 움직일 때 나는이 웹 사이트를 훌륭한 자원을 발견했습니다

: http://www.parashift.com/c++-faq-lite/ - 아마 당신은 너무 그것을 발견 할 것이다, 그것은 좋은 설명

C에서
1

C++ 구문 그냥 같다. 기본 생성자를 사용하려는 경우, 당신은 그냥 같이 호출 : 당신은 매개 변수가있는 생성자를했을 경우

ClassA obj1; 

, 당신은 이런 식으로 부를 것이다 : 참으로 이동

ClassA obj1(5); 
2

++를 많이 제공합니다, 당신은 당신이 어디를 결정해야 당신의 물건이 상주 해지기를 원한다. 어느 위치에서 어떤 메모리, 스택 또는 힙을 의미합니다.

개체 인스턴스화는 두 단계 프로세스입니다. 먼저 메모리가 필요하며 스택에서 가져 오거나 힙에서 할당합니다. 둘째, 생성자 함수를 호출하여 원하는 값 (예 : 객체를 생성)으로 메모리를 초기화합니다.

이 두 구문은 스택과 힙이라는 두 가지 가능한 메모리 위치에 대한 것입니다.

스택 할당 객체에 대한 구문과 명백하게 누락 된 괄호와 관련하여 객체의 정의와 구성 및 함수 선언을 명확히하는 것입니다. 실제로 ClassA obj();은 매개 변수를 사용하지 않고 ClassA 객체를 반환하는 함수를 선언합니다.

관련 문제