문제

내가 C#에서 C ++로 왔기 때문에 C ++에서 모든 것이 미쳤다. 누군가가 왜 우리가 C ++에서 이런 종류의 인스턴스화를 가지고 있는지 설명 할 수 있을지 궁금합니다 : 메소드 1 :

ClassA obj1; // this is going to stack

방법 2 :

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

반면 C ++에서 C# 방식의 일반적인 인스턴스화가 없습니다.

ClassA  obj2 = new obj2();

그리고 Method1에서 한 가지 더 질문은 classa에서 인스턴스를 얻지 만 () 없이는 이것이 내가 혼란스러워하는 정확한 장소입니다. 왜 우리가 그렇게 설치해야합니까? 우리의 classa에는 생성자가 있지만 괄호가없는 인스턴스팅 ??? 우리는 어떻게 생성자라고 부릅니까?

추신 :이 주제를 읽었습니다.

C ++에서 객체를 인스턴스화하기위한 다른 방법

C ++의 스택, 정적 및 힙

스택과 힙은 무엇이며 어디에 있습니까?

도움이 되었습니까?

해결책

실제로 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

즉, 두 가지 방법은 한 가지 측면에서도 크게 다릅니다. 첫 번째 방법은 객체를 만듭니다. 두 번째는 객체에 대한 포인터를 만듭니다. 포인터를 갖는 것에 대한 좋은 점은 스택에 메모리가 최소화되는 매개 변수로 전달할 수 있다는 것입니다 (전체 객체 대신 포인터가 복사됩니다). 물론, "&"를 사용하여 항상 스택에 할당 된 객체의 주소를 가져 오거나 참조로 전달할 수 있습니다. 그러나 스택에 할당 된 객체를 사용할 때는 스코프에 특히주의를 기울일 수 있습니다.

Java에서 C ++로 이사했을 때이 웹 사이트가 훌륭한 리소스를 발견했습니다. http://www.parashift.com/c++-faq-lite/ - 당신도 아마 그것을 찾을 것입니다. 그것은 좋은 설명을 많이 제공합니다.

다른 팁

C ++에서는 객체가있는 위치를 결정해야합니다. 내가 어떤 기억, 스택 또는 힙을 의미하는지에 의해.

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

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

스택 할당 된 객체에 대한 구문과 명백히 누락 된 괄호와 관련하여, 객체의 정의와 구성과 함수 선언 사이를 명확하게하는 것입니다. 물론, ClassA obj(); 매개 변수가없는 함수를 선언하고 classa 객체를 반환합니다.

C ++ 구문은 그와 같습니다. 기본 생성자를 사용하려면 다음과 같이 부릅니다.

ClassA obj1;

매개 변수가있는 생성자가 있으면 다음과 같이 부릅니다.

ClassA obj1(5);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top