우선, 한 언어에서 다른 언어보다 더 잘 해결되는 문제가 항상 있습니다. "더 나은"에 대한 정의를 위해 다른 언어보다 "더 나은"특정 문제를 해결하는 언어가 항상 있습니다. 그러나 매우 많은 수의 문제는 매우 유사한 요구 (일부 I / O, 일부 계산)를 가지며 유사한 요구 사항 (합리적인 신뢰성, 합리적인 성능)에 직면합니다.
C를 이미 알고 있듯이, 대다수의 문제에 대해 C ++은 중요한 단점과 많은 개선 사항을 제공하지 않는다고 말합니다. 대담한? 어떤 사람들은 그렇게 생각하는 것처럼 보이지만 실제로는 그렇지 않습니다. 매우 일반적인 몇 가지 C ++ 오해를 해결하여 시작해 보겠습니다.
C ++가 C보다 느립니다. 잘못되었습니다! 많은 C 프로그램도 유효한 C ++ 프로그램이므로 C 컴파일러 나 C ++ 컴파일러로 컴파일 할 때 C 프로그램이 동일한 속도로 실행되어야합니다.
C ++ 특정 기능에는 오버 헤드가 필요합니다. 잘못된! 특정 C ++ 특정 기능 (가상 함수 호출 또는 예외와 같은)에 의해 도입 된 소위 오버 헤드는 C에서 유사한 기능을 구현할 때 사용자가 도입 한 오버 헤드와 비슷합니다.
C ++는 객체 지향입니다. 잘못된! C ++ 언어에는 객체 지향 프로그래밍 및 일반 프로그래밍을 용이하게하는 언어 확장이 포함되어 있습니다. C ++은 객체 지향 디자인을 어디에서나 강요하지 않으며 단지 허용합니다. C는 객체 지향 프로그래밍도 가능하게하며, C ++는 더 단순하고 오류 발생이 적습니다.
그래서, 당신이 나를 믿는다면, 우리는 "C ++가 C보다 크게 나쁘지 않다"는 것을 확립했습니다. C ++를 더 나은 C로 만드는 이유를 살펴 보겠습니다.
강력한 타이핑 C ++의 타입 시스템은 C보다 강력합니다. 이렇게하면 많은 일반적인 프로그래밍 오류가 방지됩니다. 다음으로 중요한 기능과 함께 강력한 타입 시스템은 불편하지 않습니다.
매개 변수화 된 유형 템플릿 키워드를 사용하면 프로그래머가 알고리즘의 일반적인 (유형에 구애받지 않는) 구현을 작성할 수 있습니다. C에서 다음과 같은 요소로 일반 목록 구현을 작성할 수 있습니다.
struct element_t {
struct element_t *next, *prev;
void *element;
};
C ++을 사용하면 다음과 같은 내용을 작성할 수 있습니다.
template <typename T>
struct element_t {
element_t<T> *next, *prev;
T element;
};
C ++ 구현은 일반적인 프로그래머 오류 (예 : 잘못된 유형의 요소를 목록에 넣는 것)를 방지 할뿐만 아니라 컴파일러에 의한 더 나은 최적화를 허용합니다! 예를 들어, 일반적인 정렬 구현은 C와 C ++ 모두에서 사용할 수 있습니다.
C 루틴은 다음과 같이 정의됩니다.
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
C ++ 루틴은 다음과 같이 정의됩니다.
template void sort(RandomAccessIterator first, RandomAccessIterator last);
예를 들어 정수 배열을 정렬하는 경우 C의 경우 단일 비교마다 함수 호출이 필요한 반면 C ++ 구현에서는 실제 정렬 루틴이 다음과 같이 컴파일러가 정수 비교 호출을 인라인 할 수 있습니다. 템플릿 인수에 올바른 유형을 삽입하여 컴파일러가 컴파일 타임에 자동으로 인스턴스화합니다.
- 더 큰 표준 라이브러리 C ++를 사용하면 C 표준 라이브러리를 완전히 사용할 수 있습니다. 물론 C 표준 라이브러리는 실제 프로그램을 작성할 때 매우 유용한 리소스이므로 매우 중요합니다. 그러나 C ++에는 표준 템플릿 라이브러리가 포함되어 있습니다. STL에는 위의 정렬 루틴과 같은 유용한 템플릿이 많이 있습니다. 여기에는 목록, 맵, 세트 등과 같은 유용한 공통 데이터 구조가 포함됩니다. 정렬 루틴과 마찬가지로 다른 STL 루틴 및 데이터 구조는 프로그래머가 요구하는 특정 요구에 맞게 "맞춤화"됩니다. 유형.
물론 STL은 은색 총알이 아니지만 일반적인 문제를 해결할 때 큰 도움이됩니다. C로 얼마나 자주 목록을 구현 했습니까? RB-tree가 시간이 있었다면 얼마나 자주 더 나은 솔루션이 되었습니까? STL을 사용하면 그러한 타협을 할 필요가 없습니다. 더 적합하다면 트리를 사용하십시오. 목록을 사용하는 것만 큼 쉽습니다.
좋습니다, 그래서 나는 좋은 부분에 대해서만 논의했습니다. 단점이 있습니까? 물론 있습니다. 그러나 그 숫자는 날마다 줄어들고 있습니다. 설명하겠습니다 :
좋은 C ++ 컴파일러는 없습니다 . 이런 식으로 오랫동안 사용되었습니다. 그러나 언어는 1998 년에 표준화되었다는 것을 기억해야합니다. 언어는 C보다 복잡한 복잡한 언어입니다. 컴파일러가 표준을 따라 잡는 데 오랜 시간이 걸렸습니다. 그러나이 글을 쓰는 시점에서 가장 널리 사용되는 플랫폼에 사용할 수있는 좋은 컴파일러가 있습니다. 버전 3.X의 GCC는 일반적으로 매우 우수하며 GNU / Linux 및 대부분의 UNIX 플랫폼에서 실행됩니다. 인텔은 Win32 용으로 좋은 컴파일러를 가지고 있습니다. 또한 매우 좋지만 불행히도 여전히 하위 수준 인 MS STL에 의존합니다.
사람들은 좋은 C ++을 모른다. 이것은 종종 들리는 불만은 아니지만, 내가 많이 본 것입니다. C ++는 크고 복잡한 언어입니다. 그러나 특히 "OOP는 기아를 해결하고, AIDS와 암을 치료합니다"시대에 많이 찬성했던 언어였습니다. 결과적으로 여기저기서 몇 가지 클래스 선언이있는 나쁜 C C 코드, 기본적으로 나쁜 C가 많이 있으며 학습 자료로 사용되는 것으로 보입니다. 이것은 C ++을 알고 있다고 믿는 많은 사람들이 실제로 엉터리 코드를 작성한다는 것을 의미합니다. 너무 나쁘고 문제이지만 C ++에서 이것을 비난하는 것은 불공평하다고 생각합니다.
따라서 C ++의 두 가지 주요 문제점은 C ++이 젊은 언어라는 결과입니다. 시간이 지나면 그들은 사라질 것입니다. 그리고 대부분의 문제에 대해 좋은 프로그래머를 얻거나 스스로 좋은 C ++을 배울 수 있다면 오늘날 문제는 실제로 문제가되지 않습니다.