코딩 모닥불
  • 메뉴 닫기
  • 글작성
  • 방명록
  • 환경설정
    • 분류 전체보기
      • C++
      • 알고리즘
      • 표준 라이브러리
      • 백준(BOJ)
  • 홈
  • 태그
  • 방명록
C++

[C++] 표현식의 좌측값( lvalue )과 우측값( rvalue )

표현식의 범주( category )표현식이란 리터럴( literal ), 변수( variable ), 연산자( operator ) 그리고 함수 호출( function call )의 연속된 식이라고 할 수 있습니다.int add( int a, int b){ return a + b;}int main(){ int var{ 3 }; int A = 3; // 3은 리터럴 int B = var; // var는 변수 int C = add( 2, 5 ); // 함수 int D = var + 4; // 연산자}그리고, C++은 이러한 표현식을 두 가지 범주, 좌측값과 우측값으로 나눕니다. ● 먼저, 좌측값( lvalue )은 메..

2025. 4. 13.
C++

[C++] 컴파일러가 자동으로 생성하는 멤버 함수들

클래스의 특수 멤버 함수들( special member functions )컴파일러가 자동으로 작성하는 특수 멤버 함수는 모두 6개로, 구체적으로는 기본 생성자( default constructor ), 소멸자( destructor ), 복사 생성자( copy constructor ), 복사 대입 연산자( copy assignment operator ), 이동 생성자( move constructor ), 이동 대입 연산자( move assignment operator )가 그것들입니다. 이 글에서는, 이 멤버 함수들이 생성되는 데는 필요한 조건과, 그 조건이 생기게 된 이유를 정리합니다. 먼저, 이 특수 멤버 함수들이 자동으로 작성되는 가장 기본적인 조건은, 클래스 내에 명시적인 멤버 함수가 이미 구현되..

2025. 4. 11.
C++

[C++] 가상 함수를 호출하기 위한 동적 바인딩( dynamic binding )

동적 바인딩( dynamic binding )이 필요한 이유함수명과 함수를 이루는 코드가 있는 메모리 주소를 매칭시키는 것을 함수 바인딩( binding )이라고 합니다. 이 바인딩을 통해서, 함수를 호출하면, 이 함수를 이루는 코드가 있는 주소로 실행 제어( execution control )가 이동해서, 함수를 실행하게 되는 것입니다.이런 함수 바인딩은 컴파일 시에 이루어지기 때문에, 정적(static) 바인딩이라고 합니다. 그리고, 일반 함수와 클래스의 일반 멤버 함수는 이 정적 바인딩을 거칩니다. 그럼, 가상 함수( virtual function )도 정적 바인딩을 할 수 있을까요? [C++] 다형성을 구현하기 위한 가상 함수( virtual function )가상 함수( virtual funct..

2025. 4. 9.
C++

[C++] 다형성을 구현하기 위한 가상 함수( virtual function )

가상 함수( virtual function )가상 함수( virtual function )는 기본( base ) 클래스에서 virtual 키워드를 사용하여 선언되고, 파생 클래스에서 재정의( overriding )되는 멤버 함수를 말합니다. 이러한 가상 함수가, 파생 클래스에서 재정의 되는, 일반 멤버 함수와 다른 점은, 파생 클래스가 기본( base ) 클래스 타입의 포인터나 참조를 통해 접근될 때, 가상 함수를 호출함으로써, 기본 클래스의 함수가 아닌 파생 클래스 버전의 함수를 사용할 수 있다는 점에 있습니다. 코드를 보는 것이 이해하는데 더 도움이 될 것입니다.#include using namespace std;class CBase{ // 기본 클래스public: virtual void VFu..

2025. 4. 7.
C++

[C++] 추상 클래스( abstract class )와 순수 가상 소멸자

추상 클래스와 순수 가상 함수( pure virtual function )복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 추상화라고 합니다.C++에서는 주로 클래스를 통해서 이런 추상화를 하게 됩니다. 다음은 형태( shape )의 개념을 추상화한 클래스 CShape를 보여줍니다.class CShape{ // 형태를 추상화한 클래스public: virtual std::string_view GetName(){ return "Undefined"; } virtual float GetArea(){ return -1; }};이 클래스는 형태의 수많은 속성 중에서, 이름과 넓이를 프로그램에서 사용할 중요한 속성으로 생각해서 가..

2025. 4. 7.
C++

[C++] 예외 클래스( exception class )

예외 클래스( exception class )throw는 예외를 발생시키기 위해서 어떠한 타입의 값이라도 사용할 수 있고, 이런 타입의 종류에는 당연히 클래스도 포함됩니다. [C++] 예외 처리를 위한 throw와 try-catch의 동작 방식C++에서의 예외( exception ) 처리C++에서는 프로그램의 오류나 기대하지 못했던 상황이 발생한 경우, 이를 처리하기 위한 예외( exception )를 발생시키면, 프로그램이 자동으로, 이 예외를 처리할 수codingbonfire.tistory.com예외를 발생시킬 때 사용되는 클래스를 예외 클래스( exceptin class )라고 부르는데, 사실 이 예외 클래스와 일반 클래스의 차이점은 전혀 없습니다.단지, 예외가 발생된 이유를 설명하기 위한 값과 함..

2025. 4. 4.
C++

[C++] 예외가 발생되지 않는 함수를 선언하는 noexcept

noexcept 지시자( specifier )noexcept는 함수 이름의 끝에 붙는 지시자로, 이 지시자가 붙은 함수는 예외( exception )를 발생시키지 않는다는 것을 명시합니다. 하지만, noexcept 함수 실행 시, 컴파일러에 의해 예외가 발생하는 것이 방지되거나 해서, 프로그램이 예외로부터 안전해지는 것을 말하는 것이 아니라, 이 함수에서는 예외가 발생하지 않으니까, 예외에 민감한 문맥에서도 안심하고 사용할 수 있을 뿐만 아니라, 컴파일러는 이 함수를 최적화해서 성능을 향상할 수 있다고 얘기를 하는 것입니다. 즉, 이 noexcept 지시자를 사용한다는 것은, 함수와 이 함수를 사용한 프로그램 간의 일종의 계약이라고 봐야 합니다. 그런데 만약, 이렇게 말해온 함수에서 예외가 외부로 발생하..

2025. 4. 3.
C++

[C++] 생성자와 소멸자에서의 예외( exception ) 처리

생성자( constructor )에서의 예외 처리생성자를 작성하다 보면, 의외로 문제가 발생할 여지가 꽤 있다는 것을 깨닫게 됩니다. 맨 먼저 떠오르는 경우는, 메모리를 대규모로 할당할 때, 실패하는 경우를 들 수 있습니다. 또 다른 경우로는, 클래스 객체가 지속적으로 사용하게 될 변수의 값을 채워 넣기 위해, 생성자에서 호출하는 계산 함수의 오류를 들 수 있습니다.하지만, 이런 문제들은 다른 곳에서도 얼마든지 일어날 수 있는 경우들입니다. 그러나, 일반 함수와 달리, 생성자는 성공 여부를 반환할 수 없기 때문에, 이런 경우를 자연스럽게 처리할 수 없습니다. 그래서 이를 우회하는 방식으로, 실패했다는 정보를 객체 안에 저장해 두거나, 객체를 사용 전 검산을 통해서 제대로 된 결과를 갖고 있다는 것을 확인..

2025. 4. 2.
C++

[C++] 예외 처리를 위한 throw와 try-catch의 동작 방식

C++에서의 예외( exception ) 처리C++에서는 프로그램의 오류나 기대하지 못했던 상황이 발생한 경우, 이를 처리하기 위한 예외( exception )를 발생시키면, 프로그램이 자동으로, 이 예외를 처리할 수 있는 코드를 찾아 문제를 해결하는 메커니즘을 제공합니다. 이 메커니즘을 위해 만든 것이 throw와 try, catch 키워드입니다. 이 키워드들을 이용해서 문제를 처리하는 과정은 다음과 같습니다. ● 먼저, 프로그램 실행 중, 기대하지 못한 상황이 발생되면, throw 키워드를 사용해서 프로그램에게 예외가 발생되었음을 알리게 됩니다. 이 throw 키워드 바로 뒤에는, 발생한 상황을 알리는 데 도움이 되는 데이터가 따라옵니다. 이러한 데이터에는 어떤 종류의 데이터도 상관이 없습니다. 일반..

2025. 4. 1.
C++

[C++] 불필요한 중간 단계를 건너뛰기 위한 복사 생략( copy elision )

불필요한 생성자의 호출클래스의 객체를 생성하고 초기화하기 위해, 컴파일러는 이 클래스의 생성자를 호출합니다. 다음은 CSomething 클래스의 객체가 생성될 때, 어떤 생성자가 호출되는지를 보여줍니다.class CSomething{ int m_nValue;public: CSomething() : m_nValue(0) { cout ▼출력parameterized constructor called.copy constructor called.위의 st 객체는 값 10으로 초기화되는데, 이때 매개 변수 생성자( parameterized constructor )가 호출됩니다.그리고, 이 st 객체로부터 obj 객체를 초기화할 때, CSomething 클래스의 복사 생성자( copy cons..

2025. 3. 31.
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »

전체 카테고리

  • 분류 전체보기
    • C++
    • 알고리즘
    • 표준 라이브러리
    • 백준(BOJ)

블로그 인기글

태그

  • #constexpr
  • #std::stack
  • #namespace
  • #포인터
  • #전방 선언
  • #std::string_view
  • #Lamda
  • #decltype
  • #const
  • #inline
  • #헤더 가드
  • #static_cast
  • #std::queue
  • #예외 처리
  • #동적 계획법
  • #auto
  • #std::vector
  • #범위 기반 for
  • #함수 객체
  • #이진 탐색
  • #상수 표현식
  • #초기화
  • #전처리기
  • #using
  • #복사 생성자
  • #std::sort
  • #깊이 우선 탐색
  • #Enum
  • #소멸자
  • #std::unique_ptr
MORE
애드센스 광고 영역
Powered by Privatenote Copyright © 코딩 모닥불 All rights reserved. TistoryWhaleSkin3.4

티스토리툴바