문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 C++ (문단 편집) === C와의 차이점 === 초기 C++가 C언어를 기반으로 시작했기 때문에 지금도 대부분의 C 프로그램은 C++ [[컴파일러]]에서도 문제없이 컴파일된다. 초기 C++ 컴파일러는 일단 C++ 코드를 C로 변환하고 그걸 C로 재컴파일하는 방식을 사용했을 정도. 다만, C가 항상 C++의 부분집합이었던 것은 아니라 지금도 구조체같이 몇몇 부분에서 차이점이 있다. "잘 짜인 C 프로그램은 C++ 컴파일러로 컴파일할 수 있어야 한다"는 말도 1999년에 C99 표준이 나오면서 틀린 말이 되었다. 순수 C 소스 코드를 C++로 컴파일 할 때 문제의 여지가 생길 가능성이 있다. 그러나 C++는 C와 프로그래밍 패러다임이 크게 다르다. C는 태초부터 절차 지향으로 설계된 운영체제를 만들기 위한 언어였으며, 지금도 메모리와 각종 저수준(low level) 프로그래밍을 위한 언어이기 때문이다 [* 다만 C에서 C++의 방법론을 따라가지 못하는 건 아니다. [[GNOME]]의 핵심 라이브러리인 Glib이 대표적으로, C 언어로 객체지향을 짜도록 구성되어 있다. incomplete type declaration 트릭을 이용하여 캡슐화를 흉내내고, 매크로와 컴파일러 확장을 이용해서 type-generic function을 만들어 쓰고, struct hack을 이용하여 vector를 흉내 내는 식이다. 그러나 저런 트릭은 언어 차원에서 정식으로 제공한다기보다 말 그대로 '트릭'에 가까우므로 이상한 조건들이 붙는 경우가 종종 있고, 그것들을 정확히 파악하고 있지 않으면 상당히 찾아내기 어려운 에러를 내는 경우도 많다.]. 반면 C++는 절차 지향, 객체 지향, 일반화 프로그래밍, 함수형 프로그래밍을 모두 지원하는 언어다. 그래서 C로 작성된 프로그램에서 C++ 방식으로 코딩하려면 해당 코드에서 C++에 새로 도입된 것을 추가하는 게 아니라, 설계부터 시작해서 완전히 새로 해야 하는 경우가 많다. 곧 C를 알고 있다고 C++를 쉽게 할 수 있는 것은 아니다. 세간에서 C, C++ 중 어디가 쉽다라던가 하는 건 어디까지나 간단한 프로그램의 예일 뿐이다. 또한 C++의 객체지향이 다른 객체지향 언어에 비해 이해하기가 만만한 개념이 아닌 데다가 C++의 객체지향은 C언어를 기저에 유지하면서 여러 구성 요소를 추가했기 때문에 신경 써야 할 부분이 많다. 그래서 다른 객체지향 언어에서보다 잘 다루는데 더 많은 공부가 필요하다. C++을 잘 활용하려면 [[표준 템플릿 라이브러리]]까지 배운 다음 자료구조 및 알고리즘, 입출력 스트림, 그리고 적어도 다른 언어에서 일반화 프로그래밍이 쓰이는 것처럼 템플릿을 활용할 수는 있어야 한다. 그래서 C언어를 알고 있는 사람이 C++ 초보자용 교재를 1권 끝내고 프로그램을 만들어 보라고 해도, 대부분 C++의 입출력 객체를 이용하는 정도를 넘지 못하고 절차적 프로그래밍을 그대로 따라가는 영락없는 C 방식에서 벗어나지 못한다. C++에서 C 전향도 만만치가 않다. 절차지향 언어의 사고방식이 머릿속에 굳어버려 코드를 전환하는 데 방해가 된다. C++가 C의 모든 기능을 포괄하고 있으므로 C++를 할 줄 알면 C도 할 줄 안다고 생각하기 쉽지만, 사실 C++가 명시적으로 비교적 간단히 사용할 수 있도록 제공하는 기능들을 C에서는 암묵적으로 여러 가지 수많은 '트릭'을 통해서 쥐어짜내듯이 만들어 사용하는 경우가 많다. 지금도 많은 대학에서 컴공 1학년 1학기 때 C를 먼저 가르치고 빠르면 2학기, 늦어도 2학년에 C++를 가르치지만, 반면에 교수가 절차 지향이 머리에 굳어버린다며 C++와 객체를 먼저 가르치고 C는 아예 건드리지도 않고 다른 하드웨어 관련 학과에서만 가르치는 대학들도 많다. 따라서, 초심자 입장에서는 '''C와 C++는 완전히 다른 언어로 파악하고 접근해야 한다.''' ---- {{{#!syntax cpp struct A { int x, y; }; struct B { struct A a; }; struct A a = {.y = 1, .x = 2}; // valid C, invalid C++ (out of order) int arr[3] = {[1] = 5}; // valid C, invalid C++ (array) struct B b = {.a.x = 0}; // valid C, invalid C++ (nested) struct A a = {.x = 1, 2}; // valid C, invalid C++ (mixed) }}}[* C99에서 추가된 지정 초기자(Designated Initializers)] 그외에 {{{_Generic(type)}}}을 사용한 자료형에 대해 안전한 매크로, K&R 스타일의 함수 정의 구문 [* {{{f(int a, int b) { ... } }}} 를 {{{f(a, b) int a; int b; { ... } }}} 로 작성하는 것.]의 지원 등 C에서만 지원되는 문법이 몇 있다. ---- {{{#!folding 클래스 비교 코드 {{{#!syntax cpp // C 스타일 struct GameObject { long id; float x, y, z; }; void InitObject(GameObject * obj, long id) { obj->id = id; obj->x = 0; obj->y = 0; obj->z = 0; } void InitObject(GameObject * obj, long id, float x, float y, float z) { obj->id = id; obj->x = x; obj->y = y; obj->z = z; } void MoveObject(GameObject * obj, float x, float y, float z) { obj->x = x; obj->y = y; obj->z = z; } // C++ 스타일 class GameObject { public: constexpr GameObject(const long& new_id, const float& cx = 0, const float& cy = 0, const float& cz = 0) noexcept : id(new_id), x(cx), y(cy), z(cz) {} constexpr void Move(const float& x= 0, const float& y = 0, const float& z = 0) noexcept { this->x = x; this->y = y; this->z = z; } [[nodiscard]] constexpr std::tuple GetPosition() noexcept { return std::tie(x, y, z); } [[nodiscard]] constexpr std::tuple GetPosition() const noexcept { return std::tie(x, y, z); } long myID = -1; // 기본값 float x, y, z; } }}} }}} C의 함수에서 어떤 고정된 객체를 참조하려면 포인터를 포함해 다중의 인자값 전달이 필수적인데 구조체에 전부 때려박더라도 전역 변수가 아닌 이상 적어도 1개는 전달해야 한다. 반면에 C++ 측은 클래스의 {{{this}}}를 활용하면 인자 전달 없이 클래스에 속한 메서드 호출만 할 수 있다. 그외에 기본 연산자 오버로딩, friend를 통해 외부 클래스 또는 함수와 속성 공유를 할 수 있다. ---- {{{#!syntax cpp std::ios_base::sync_with_stdio(false); }}} {{{iostream}}}이나 {{{fstream}}} 등 입출력 스트림이 C의 입출력 함수보다 상당히 느리다. C++의 입출력 스트림은 예외없는 입출력을 위해 {{{try}}}문은 물론 온갖 내부 비트 플래그가 돌아가고 있기 때문이다. 만약 프로그램내에서 {{{std::cin}}}, {{{std::cout}}}등 C++ 스트림[*iostream] 계열만 사용하고 {{{stdin}}}, {{{stdout}}}등 표준 C 스트림[*stdio.h]을 사용하지 않는다면, 각 입출력 스트림간의 동기화를 정지시켜 iostream에 비약적인 속도 향상을 가져올 수 있다 [* 시간 제한이 빡빡한 PS(문제풀이) 쪽에서는 거의 매번 쓰일 정도인 기능이지만 [[Visual Studio]]에서는 의미 없으니 참고. [[https://github.com/microsoft/STL/issues/3669|#]]].저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기