Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++

  1. C++에서 new를 사용해 2차원 배열 동적으로 선언하는 방법

    동적 2차원 배열의 기본 개념C++에서 new 연산자로 생성한 동적 2차원 배열은 본질적으로 배열을 가리키는 포인터들의 배열입니다. 따라서 먼저 이중 포인터 형태의 포인터 배열을 할당한 뒤, 반복문을 사용해 각 행에 해당하는 1차원 배열을 개별적으로 초기화해야 합니다.예제 코드#include<iostream> using namespace std; int main() { int rows = 3, cols = 4; // 1단계: 포인터 배열(행) 할당 int** arr = new int*[rows];

  2. 가변 길이 배열(VLA)이 C++ 표준에 포함되지 않는 이유와 대안

    스택(stack)은 일반적으로 사용할 수 있는 공간이 매우 제한적이기 때문에, 잠재적으로 크기가 큰 배열을 스택에 생성해야 하는 상황은 바람직하지 않습니다. 배열의 크기를 미리 알고 있다면 정적(static) 배열을 사용하면 되지만, 크기를 미리 알 수 없다면 안전하지 않은 코드를 작성할 위험이 커집니다.VLA가 C++ 표준에 없는 핵심 이유가변 길이 배열(VLA, Variable-Length Array)이 C++에 기본 기능으로 포함되지 않는 결정적인 이유는 타입 시스템에 대한 대규모 변경이 필요하기 때문입니다. 참고로 C 언어는

  3. C++ 3법칙 vs 5법칙, 무엇이 다르고 언제 써야 할까?

    C++ 3법칙(Rule of Three)이란?3법칙은 C++ 프로그래밍에서 널리 통용되는 경험 법칙이자 좋은 코딩 습관입니다. 이 규칙에 따르면, 클래스에서 다음 중 하나라도 명시적으로 정의해야 한다면 나머지 두 가지도 함께 정의할 필요가 있을 가능성이 높습니다.복사 생성자(copy constructor)대입 연산자(assignment operator)소멸자(destructor)그 이유는 무엇일까요? 위 세 가지 중 하나라도 필요하다는 것은 해당 클래스가 동적으로 할당된 자원을 직접 관리하고 있다는 신호이기 때문입니다. 예를 들어

  4. C++11의 5의 법칙(Rule of Five)이란? 리소스 관리의 핵심 원칙

    C++11의 5의 법칙(Rule of Five)이란?C++에서 5의 법칙(Rule of Five)은 리소스 관리를 위해 적용되는 중요한 설계 원칙입니다. 리소스 관리가 제대로 이루어지면 클라이언트 코드는 관리 대상 객체의 수명(lifetime)을 신경 쓸 필요가 없어지며, 메모리 누수와 같은 문제를 사전에 방지할 수 있습니다.하지만 이러한 관리에는 비용이 따릅니다. 5의 법칙은 다음 다섯 가지 함수 중 하나라도 직접 작성해야 한다면, 나머지 함수들에 대한 정책도 반드시 함께 마련해야 한다는 규칙입니다.예를 들어 객체 Foo가 있고,

  5. C++98 vs C++03 vs C++0x vs C++11: C++ 표준 버전별 차이점 총정리

    C++ 표준 버전의 발전 과정C++는 오랜 시간 동안 꾸준히 발전해 온 프로그래밍 언어로, 각 표준 버전마다 언어의 성능과 편의성을 크게 향상시키는 변화가 있었습니다. 이 글에서는 C++98부터 C++11까지 각 표준 버전의 특징과 차이점을 살펴보겠습니다.C++98 – 최초의 공식 표준C++98은 C++ 역사상 최초로 제정된 국제 표준입니다. 이 표준에서는 클래스, 상속, 다형성 등 언어의 핵심 구조체와 함께 STL(표준 템플릿 라이브러리) 및 표준 라이브러리가 처음으로 공식적으로 정의되었습니다. 현대 C++ 개발의 기반이 된 중요

  6. C++ placement new의 용도와 사용법 완벽 정리

    C++ placement new란?간단히 말해, placement new는 이미 할당되어 있는 메모리 공간 위에 새로운 객체를 생성할 수 있게 해주는 C++의 기능입니다. 새로 메모리를 할당하지 않고 기존에 확보된 메모리를 그대로 재사용하기 때문에 불필요한 할당·해제 오버헤드를 없앨 수 있어 성능 최적화에 매우 유용합니다.기본 문법은 다음과 같습니다.new (address) (type) initializer즉, 생성할 객체의 타입과 함께 해당 객체가 만들어질 메모리 주소를 직접 지정할 수 있습니다.예제 코드#include <i

  7. C++0x와 C++11의 차이점은 무엇일까?

    C와 C++ 표준은 일반적으로 발표된 연도를 따라 이름이 붙습니다. 예를 들어 C++의 경우 최초의 표준이 1998년에 발표되어 C++98이라 불리며, 2003년에 이루어진 첫 번째 수정판은 C++03이라고 부릅니다.C++0x라는 이름의 유래그다음 개정 표준은 원래 2008년까지 완성될 것으로 예상되었습니다. 하지만 작업 일정이 확실하지 않았기 때문에, 확정 전까지는 임시로 C++0x라는 이름을 사용했습니다. 여기서 x는 8 또는 9를 의미했는데, 즉 2008년 또는 2009년에 발표될 것을 가정한 명칭이었습니다.그렇다면 두 이름의

  8. -std=c++11과 -std=gnu++11의 차이점 완벽 정리

    -std=c++11과 -std=gnu++11, 무엇이 다를까? GNU C++ 컴파일러인 g++는 표준 C++ 언어에 포함되지 않은 고유한 확장 기능(GNU extensions)을 제공합니다. 두 컴파일 옵션의 차이는 바로 이 확장 기능의 활성화 여부에 있습니다. -std=c++11: ISO C++11 표준만 엄격하게 준수하며, 표준을 위반할 가능성이 있는 GNU 확장 기능은 비활성화됩니다. -std=gnu++11: C++11 표준을 따르면서도, 표준을 위반하는 GNU 확장 기능까지 함께 활성화합니다. 주의할 점 다만, 표준을 위

  9. GCC의 C++ 표준 지원: -std 옵션으로 표준 선택하기

    GCC는 여러 ISO C++ 표준에 해당하는 다양한 C++ 방언(dialect)을 지원하며, 컴파일 시 어떤 표준을 적용할지는 -std= 명령줄 옵션으로 선택할 수 있습니다. GCC가 지원하는 C++ 표준 C++98 / C++03 1998년에 제정된 최초의 ISO C++ 표준으로, 2003년 개정판인 C++03과 이후의 결함 보고서(defect report)까지 완전히 지원합니다. C++11 당시 C++0x로 불리던 2011년 C++ 표준을 GCC 4.8.1에서 처음으로 완전하게 구현했습니다. 자동 타입 추론(auto), 람다

  10. C++11의 핵심 변화 총정리: 모던 C++ 시대의 개막

    C++11이란 무엇인가?C++11은 2011년에 발표된 현대적인 C++ 표준으로, 기존 언어에 수많은 중요한 확장 기능과 개선 사항을 도입한 버전입니다. 이 표준은 단순한 업데이트를 넘어 C++을 더욱 안전하고 효율적이며 표현력 있는 언어로 탈바꿈시킨 전환점으로 평가받고 있습니다.다음은 C++11에서 추가되거나 변경된 주요 기능들입니다.언어 차원의 주요 변화초기화 리스트(Initializer lists)자동 타입 추론(Automatic type deduction)Rvalue 참조와 이동 생성자(Move constructors)con

  11. C++11 완벽 정리: 현대 C++ 표준의 핵심 변화와 주요 기능

    C++11이란 무엇인가?C++11은 2011년에 발표된 현대 C++ 표준으로, 기존 언어에 수많은 중요한 확장 기능과 개선 사항을 도입한 버전입니다. 이 표준은 2011년 8월 12일 국제표준화기구(ISO)의 승인을 받았으며, 그 이전 표준이었던 C++03을 공식적으로 대체했습니다.C++0x라는 이름의 유래C++11은 발표 전까지 C++0x라는 이름으로도 널리 알려져 있었습니다. 원래 다음 개정 표준은 2008년경 완성될 것으로 예상되었지만, 일정이 불확실하여 x가 8 또는 9를 의미할 수 있는 C++0x라는 임시 명칭이 사용되었습

  12. C++의 POD(Plain Old Data) 타입이란 무엇일까?

    POD는 C++에서 Plain Old Data(평범한 옛날 데이터)의 약자로, C 언어와 호환되는 단순한 데이터 구조를 의미합니다. 쉽게 말해, 멤버 변수만 가지고 있고 사용자가 정의한 생성자, 소멸자, 복사 생성자, 대입 연산자, 가상 함수(virtual function) 등이 전혀 없는 클래스나 구조체를 뜻합니다. POD 타입의 조건 POD 타입이 되기 위해서는 다음과 같은 특성을 만족해야 합니다. 사용자 정의 생성자(constructor)와 소멸자(destructor)가 없어야 합니다. 가상 함수(virtual functio

  13. C++11 람다 표현식(Lambda Expression)이란? 개념과 사용법 총정리

    C++ STL에는 std::for_each처럼 유용하게 활용할 수 있는 범용 함수들이 포함되어 있습니다. 하지만 이러한 함수들은 실제로 사용하기가 다소 번거로울 수 있습니다. 특히 적용하려는 함수 객체(functor)가 해당 함수에서 딱 한 번만 사용될 경우 더욱 그렇습니다.단 한 곳에서만 사용할 함수를 위해 네임스페이스에 별도로 정의해 두는 것은 비효율적입니다. 이러한 문제를 해결하는 방법이 바로 익명 함수(anonymous function)입니다.람다 표현식의 등장C++11부터 도입된 람다 표현식(lambda expression

  14. C++의 집합체(Aggregate)와 POD란 무엇일까?

    POD는 C++에서 Plain Old Data(직역하면 평범하고 오래된 데이터)를 뜻하는 약어입니다. 이름 그대로 C 스타일의 단순한 데이터 구조를 의미하며, 멤버 변수만 가지고 있고 메서드, 생성자, 소멸자, 가상 함수 등이 전혀 없는 클래스 또는 구조체를 말합니다. 예제 코드 #include<iostream> using namespace std; // POD struct MyStruct {     int key;     string data; }

  15. C++ 표준에서 int와 long 타입의 크기는 얼마일까?

    C++ 표준이 정수형 크기를 직접 규정하지 않는 이유C++ 표준은 정수형 타입의 크기를 바이트 단위로 명시하지 않습니다. 대신 각 타입이 반드시 표현할 수 있어야 하는 최소 값 범위만을 규정합니다. 이 최소 범위로부터 해당 타입이 가져야 할 최소 비트 수를 쉽게 계산할 수 있습니다.예를 들어, 표준에 따르면 int는 최소 16비트, long은 최소 32비트를 보장해야 하며, 실제 구현에서는 이보다 더 클 수 있습니다.플랫폼별 일반적인 데이터 모델표준 자체가 아니라 실제로 널리 사용되는 플랫폼별 크기는 다음과 같습니다.32비트 시스템

  16. C++에서 배열 범위를 벗어난 접근 시 오류가 발생하지 않는 이유

    C++은 경계 검사를 수행하지 않습니다이러한 현상의 핵심 원인은 C++가 배열의 경계 검사(bounds checking)를 수행하지 않기 때문입니다. Java나 Python과 같은 언어에는 내장된 경계 검사 기능이 있어, 배열 범위를 벗어난 요소에 접근하려고 하면 즉시 예외(exception)를 발생시킵니다.반면 C++는 설계 단계부터 동일한 기능을 하는 C 코드보다 느려서는 안 된다는 원칙을 따랐습니다. 그런데 C 언어 자체가 배열 경계 검사를 하지 않기 때문에, C++도 성능 저하를 피하기 위해 이 검사 과정을 생략한 것입니다.

  17. C++에서 함수로 객체를 전달하는 5가지 방법 완벽 정리

    C++에서는 객체를 함수에 전달하는 방법이 여러 가지 있으며, 각 방식마다 복사 여부와 원본 데이터 변경 가능성이 다릅니다. 클래스 X가 있고 이를 fun이라는 함수에 전달한다고 가정하고, 대표적인 5가지 전달 방식을 하나씩 살펴보겠습니다. 1. 값으로 전달 (Pass by Value) 객체를 값으로 전달하면 함수 스코프 안에 객체의 얕은 복사본(shallow copy)이 새로 생성됩니다. 따라서 함수 내부에서 아무리 값을 수정해도 호출자가 넘긴 원본 객체에는 아무런 영향을 주지 않습니다. 단, 객체 크기가 클수록 복사 비용이 커진

  18. C++에서 정수 오버플로를 감지하는 방법 완벽 가이드

    C++에서 정수 오버플로를 감지하는 방법가장 안전하고 확실한 방법은 오버플로가 발생하기 전에 미리 검사하는 것입니다. 다만, 이미 발생한 오버플로를 확인할 수 있는 몇 가지 트릭적인 방법들도 존재합니다.부호 없는 정수 덧셈에서의 오버플로 감지부호 없는 정수(unsigned int)의 덧셈에서 오버플로를 감지하려면, 연산 결과가 입력값 중 하나보다 실제로 작은지 확인하면 됩니다. 예시는 다음과 같습니다.unsigned int x, y;unsigned int value = x + y;bool overflow = value < x;

  19. C++ 쉼표 연산자의 동작 원리와 활용 예제

    C++의 쉼표 연산자(comma operator)는 여러 개의 표현식을 하나로 묶어 순차적으로 실행할 수 있게 해주는 연산자입니다. 쉼표로 구분된 표현식 목록 전체의 값은 가장 오른쪽에 있는 표현식의 값으로 결정됩니다.즉, 쉼표 연산자의 핵심 역할은 일련의 연산을 순서대로 수행하도록 허용하는 것이며, 나머지 표현식들의 값은 모두 버려집니다. 따라서 마지막(오른쪽) 표현식의 결과값이 쉼표로 구분된 전체 표현식의 최종 값이 됩니다.쉼표 연산자 예제다음 프로그램은 쉼표 연산자의 동작 방식을 보여줍니다.#include <iostrea

  20. C++ 구조체(struct)와 클래스(class)의 차이점 완벽 정리

    C++ 구조체와 클래스의 기본 차이점C++에서 구조체(struct)와 클래스(class)는 문법적으로 거의 동일한 기능을 제공하지만, 한 가지 중요한 차이점이 있습니다. 바로 기본 접근 지정자(default access specifier)입니다.구조체(struct): 멤버 변수와 멤버 함수, 그리고 상속 시 기반 클래스가 기본적으로 public으로 설정됩니다.클래스(class): 멤버 변수와 멤버 함수, 그리고 기반 클래스가 기본적으로 private으로 설정됩니다.이 차이점 외에는 구조체와 클래스가 기능적으로 완전히 동일합니다. 즉

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:13/300  20-컴퓨터/Page Goto:1 7 8 9 10 11 12 13 14 15 16 17 18 19