C와 C ++의 근본적인 차이점은 무엇입니까? [닫은]


41

많은 사람들이 마치 마치 마치 C / C ++를 쓰는 경향이 있습니다. 그것들은 많은 유사점을 공유하지만 분명히 동일하지 않습니다.

그러나 C와 C ++의 근본적인 차이점은 무엇입니까? C ++는 C의 향상된 버전입니까, 아니면 C ++에없는 기능이 C에 있습니까?


2
나는 C ++가 C의 슈퍼 세트라고 생각했다
사용자

1
C ++는 향상되지 않았습니다. C.의 상위 집합입니다.
Joe DF

2
@JoeDF 처음에 시작했지만 실제로는 "C와 호환 가능"하므로 전혀 같은 의미가 아닙니다. C ++로 C로 코딩하지는 않으며 모든 표준 C가 표준 C ++와 호환되는 것은 아닙니다.
클라 임

+1 당신은 옳습니다. 이제 형제 나 사촌처럼 있습니다. 무슨 말인지 알면
Joe DF

답변:


43

다음 사항은 C ++과 관련이 있습니다.

  1. (사용자 정의) 정적 유형 시스템 : 데이터 및 사용량에 대한 정적 검사를 허용합니다. C에서 쉽게 수행 할 수있는 많은 오류를 지적합니다.
  2. multi- "paradigm": C 에서처럼 객체 지향 패러다임, 일반 패러다임 등으로 작업 할 수 있습니다.
  3. 생성자 / 소멸자 : 무언가를 만들거나 파괴 할 때 어떻게 해야할지 말하고 사용자가 올바른 기능을 찾아서 C와 같이 사용할 필요가 없도록하는 유일한 방법입니다.
  4. RAII (나쁜 이름) : 항상 메모리를 관리 할 필요는 없습니다. 물건의 범위를 유지하고 객체 수명을 설명하는 스마트 포인터를 사용하십시오. 여전히 원시 포인터를 사용할 수 있습니다.
  5. 템플릿 : 최종 컴파일 전에 유형을 조작하고 생성하는 실제 언어 인 매크로보다 낫습니다. 유형 시스템 만 부족합니다 (향후 C ++ 표준의 개념 참조).
  6. 연산자 오버로드 : 간단한 구문 방식으로 작업을 설명하고 C ++ 코드 내에 포함 된 도메인 별 언어를 정의 할 수도 있습니다.
  7. 범위가 지정된 이름 : 네임 스페이스, 클래스 / 구조, 함수 등은 이름이 충돌하지 않도록하는 간단한 규칙이 있습니다.
  8. 예외 시스템 : 리턴 코드보다 더 나은 오류를 전파하는 방법. 실제로 리턴 코드는 애플리케이션이 관리해야하기 때문에 도메인 별 논리 오류에 적합합니다. 다음 코드를 잘못 만드는 "하드"오류에는 예외가 사용됩니다. 가능하면 호출 스택에서 오류를 더 많이 포착하고, 예외를 기록하거나 (상태를 기록하여), RAII를 사용하면 잘 사용된다면 전체 프로그램이 잘못되지 않습니다.
  9. 표준 라이브러리 : C에는 고유 한 것이 있지만 모두 "동적"입니다. C ++ 표준 라이브러리는 템플릿 (컨테이너 및 알고리즘)으로 만들어진 거의 (IO 스트림이 아님) 거의 사용하는 코드 만 생성 할 수 있습니다. 더 좋은 점 : 컴파일러가 코드를 생성해야하므로 컨텍스트와 관련하여 많은 정보를 알고 있으며 템플릿 및 기타 요소 덕분에 코더가 코드를 난독 화하지 않아도 많은 최적화를 적용 할 수 있습니다.
  10. const-correctness : 변경하지 말아야 할 변수를 변경하지 않는 가장 좋은 방법입니다. 변수에 대한 읽기 전용 액세스를 지정할 수 있습니다. 컴파일 타임에만 확인되므로 런타임 비용이 없습니다.

31

C ++는 C가 처리 할 수없는 복잡성을 관리하기 위해 개발되었습니다. 예를 들어, C의 일반적인 문제는 캡슐화, 네임 스페이스 등이 없기 때문에 "변수 이름이 없어 질 수 있습니다"(실제로 말려서는 안 됨)였습니다.

또한 C에는 예외가 없으므로 오류 처리는 오류가 발생하기 쉽습니다. 라이브러리 사용자는 항상 func의 반환 값을 확인해야하지만 예외가 있으면 라이브러리 개발자는 단순히 프로그램 흐름이 중지되도록 예외를 throw합니다.

C ++는 생성자가 init 객체를 컴파일러에 의해 자동으로 호출하도록함으로써 도움을줍니다. 프로그래머가 초기화 해야하는 C 구조체와 달리 (따라서 오류가 발생하기 쉬운 다른 영역).

마지막으로, OOP에 의해 선전 된 많은 다른 장점들, 예를 들어 객체 재사용뿐만 아니라 소스 코드 등을 재사용 할 수있게하는 템플릿 및 제네릭과 같은 일반적인 프로그래밍 기반 개념이 있습니다.

그리고 여기에 나열하는 데 너무 많은 시간이 걸리는 많은 것들이 있습니다.


C ++ 생성자 대 C 구조체에 대해 작성하고 오류가 발생하기 쉽다는 것을 좋아합니다. 동의합니다. 그러나 JavaBeans에서 이것을 사용하는 Java 방식을 좋아하지 않습니다. 항상 빈 생성자를 사용하고 멤버 필드를 setter로 설정합니다. 필자의 견해로는 C 구조체만큼 오류가 발생하기 쉽다. 생성자로만 Java 객체를 설정하는 것이 좋습니다. 이에 대한 StackOverflow에 대한 내 질문 을 참조하십시오 .
Jonas

당신은 거기에 요점이 있지만 여기에 내 대답의 초점은 C 대 C ++입니다.
Jas

1
오, 누가 C와 함께 OOP를 사용하지 못하게합니까? 객체를 재사용하고 예외를 포함한 모든 작업을 수행 할 수 있습니다. C에는 OOP 프로그래밍이라는 책도 있습니다.

2
@Vlad, 당신이 말하는 것은 25 년 전의 옵션이 아닙니다.
Jas

4
여전히 사용중인 거의 모든 프로그래밍 언어에서 OOP를 수행 할 수 있지만 언어가 해당 언어를 위해 설계된 것은 아닙니다. Lua를 예로 들어 보자. 기술적으로 OOP를 허용하지만 두통을 일으키는 원인은 약 50 가지가 있습니다.
tyjkenn

15

일반적으로 C에 존재하는 모든 것은 C ++에서 지원됩니다. 분명히 그 반대는 절대적으로 거짓입니다.

간단히 말해 C ++은 객체 지향적이므로 (예를 들어 클래스가 있음) C는 그렇지 않습니다.

C ++에는 부울 유형 C89가 없습니다.

그들은 다른 언어입니다. 그들은 대부분의 구문을 공유합니다.


4
C99에는 부울 유형 (이름이 _Bool이고 bool별명으로)이 있습니다.
Jerry Coffin

1
이것은 사실이 아닙니다. 예를 들어 C99에는 long longISO C ++의 일부가 아닌 데이터 형식이 있습니다.
Chinmay Kanchi

11
오류 ... C ++는 객체 지향 일뿐만 아니라 언어에 대한 기능을 제공하기 때문에 C ++에서 객체 지향 패러다임을 사용할 수 있지만 다른 패러다임에 대한 기능도 제공합니다. 정말 중요하고 모든 것이 바뀐다는 점을 언급해야합니다. 그렇지 않으면 우리는 ... 자바에 스위치가 줄
Klaim

4
C에는 C ++에서 작동하지 않는 많은 구문이 있습니다.

1
@klez : 그렇습니다.하지만 여전히 잘못되었습니다. ANSI는 원래 C89 (부울 유형이 없었 음)를 개발했지만 새로운 개발은 이제 ISO에 의해 수행되고 ANSI는 ISO 표준을 수용하므로 현재 ANSI C 표준은 현재 ISO C 표준과 동일합니다. 부울 형식).
Jerry Coffin

8

C99에는 C ++에 존재하지 않는 (적어도 정확히 같은 형식으로) 몇 가지 기능이 있습니다 (예 : 유연한 배열 멤버, 가변 길이 배열 등).

C99는 또한 C ++ 98/03 표준에는없는 라이브러리에 많은 것을 추가했습니다. 이 중 대부분은 C ++ 11에 추가되었습니다.

기본 방향 측면에서 C는 기본적으로 구조적 절차 적 프로그래밍을 지원합니다. C ++는 객체 지향 프로그래밍, 일반 프로그래밍 및 메타 프로그래밍 (컴파일 타임에 임의 계산 수행)뿐만 아니라이를 지원합니다. C ++ 11에서는 함수 프로그래밍 지원 (예 : 람다 식)으로 잘못 인식 될 수있는 몇 가지 비트와 조각을 추가합니다. C ++ 14는 몇 가지를 더 추가했지만 대부분 방향이 크게 바뀌기보다는 실제로 더 편리합니다.


1

개인적으로 템플릿이 C ++가 C에 추가하는 가장 중요한 기능이라고 생각합니다.


1
어, 상속받은 클래스는 어떻습니까? 전 처리기 매크로로 많은 템플릿을 수행 할 수있는 반면, C에서는 정말 어려운 작업입니다.
JBR 윌킨슨

4
전 처리기 매크로는 형식이 안전하지 않습니다. 순수한 텍스트 대체이므로 디버깅이 더 어려워집니다. C에서 기본 클래스와 상속을 얻는 것은 그리 큰 일이 아닙니다. + 언어 디자이너가 선택한 것을 고수하는 대신 자신의 메타 객체 모델을 만들어야합니다. 예를 들어이
zvrba

2
내 투표는 C ++이 C보다 더 중요한 기능 (놀라운 정리 기능 때문에 생성자보다)에 대한 소멸자 일 것입니다.
Thomas Eding

@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; C의 안전한 오버로딩 / 템플릿입니다. 필자는 소멸자가 훨씬 더 중요한 기능인 C가 없다는 Thomas에 동의합니다. 그러나 소멸자는 종종 중요한 코드를 숨 깁니다. 네임 스페이스 (범위)가 가장 중요하다고 생각합니다.
YoYoYonnY
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.