C++ FAQ은 C++의 모든 고유 한 특성에 대한 훌륭한 자료이지만 찾고있는 것보다 조금 더 발전했을 것입니다. 대부분의 질문은 대답뿐만 아니라 공정하게 숙련 된 C++ 개발자에게도 신비가 있습니다 .
Google C++ 자습서를 사용하면 뭔가를 찾을 수있을 것입니다. 어셈블리 언어를 배우려는 시도 (또는 최소한 마이크로 프로세서에서 실제로 일어나는 일에 대한 간단한 소개)를 해보고 싶을 수도 있습니다. C 및 C++ 모두 하드웨어와 매우 비슷하기 때문입니다. 자바의 속도와 힘은 어디에서 유래되었지만, Java가 제공하는 더 멋진 추상화의 대가로 제공됩니다.
위의 질문에 대한 답변을 시도해 볼 수는 있지만 잘 할 수는 없습니다.
헤더 파일과 cpp 파일 간의 관계를 이해하는 열쇠 중 하나는 "번역 단위"의 개념을 이해하는 것입니다. Java 클래스 파일은 이진 형식으로 컴파일되는 기본 단위이기 때문에 변환 단위로 간주 될 수 있습니다. C++에서 거의 모든 cpp 파일은 번역 단위입니다 (이상한 일을하는 경우 예외가 있습니다).
헤더 파일은 여러 번역 단위에 포함될 수 있으며 헤더에 정의 된 내용을 사용하는 모든 곳에 포함되어야합니다. #include 지시어는 말 그대로 텍스트 대체를 수행합니다. 포함 된 파일의 내용은 #include 지시어가 그대로 삽입됩니다. 일반적으로 클래스 인터페이스를 헤더 파일에 정의하고 cpp 파일에 구현을 정의하려고합니다. 헤더를 포함 할 수있는 다른 번역 단위에 구현 세부 사항을 공개하고 싶지 않기 때문입니다. C++에서 클래스를 포함한 모든 것은 실제로 풍부한 개체가 아니라 컴파일러가 의미를 할당하는 메모리 덩어리입니다 ... 각 번역 단위에 동일한 헤더 정보를 컴파일하면 컴파일러에서 모든 번역 단위에 기억의 덩어리가 무엇을 나타내는 지에 대한 동일한 이해. 컴파일 시간 후 풍부한 데이터가 없기 때문에 리플렉션과 같은 일은 불가능합니다.
C++ 빌드 프로세스의 두 번째 단계는 링커가 컴파일 된 모든 번역 단위를 가져 와서 번역 단위에서 사용되었지만 정의되지 않은 기호 (대개 함수 호출과 변수)를 찾는 링킹입니다. 그런 다음 심볼을 정의하고 함께 링크하는 다른 번역 단위를 찾아 특정 함수에 대한 모든 호출이이를 정의하는 번역 단위로 연결되도록합니다.
클래스 메서드의 경우 클래스 인스턴스를 통해 호출해야합니다. 클래스 인스턴스는 메모리 조각에 대한 포인터입니다. 컴파일러에서 이러한 유형의 메서드 호출을 발견하면 함수를 호출하는 코드를 출력하여 this
포인터라고하는 포인터를 암시 적으로 첫 번째 인수로 함수에 전달합니다. 링커에는 클래스 개념이 없으므로 클래스에 속하지 않는 함수를 가질 수 있습니다 (메서드는 클래스의 멤버 함수이므로 적절하게 클래스가 없으므로 메서드가 아닙니다. 함수를 정의하는 변환 단위와 함수를 호출하고 함께 묶는 변환 단위를 볼 수 있습니다.
예상보다 훨씬 길어졌지만 당연히 지나치게 단순화 된 것이지만, 내 지식과 세부 수준까지는 정확합니다 ... 일부가 도움이되기를 바랍니다. 적어도 그것은 당신에게 어떤 인터넷 검색을위한 출발점을 제공해야합니다.
편집 : 모든 응답 덕분에 모든 대답이 유용하고 유익했습니다. – Whatsit
비슷한 상황에서이 페이지가 특히 유용하다는 것을 알았습니다. 특히 A3.3 (클래스) 섹션 : http://www.horstmann.com/ccj2/ccjapp3.html – Whatsit