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

[C++] 기존의 객체를 복사할 때 호출되는 복사 생성자( copy constructor )

복사 생성자( copy constructor )복사 생성자( copy constructor )란 같은 타입의 객체를 인자로 받아 그 객체의 데이터를 가지고 초기화를 수행하는 생성자를 말합니다. 다음은 CSomething 클래스의 복사 생성자가 호출되는 예를 보여줍니다.class CSomething{ int m_nValue;public: CSomething() : m_nValue(0) { cout 위에서 CSomething 타입의 other 객체로부터, 같은 타입의 obj 객체를 초기화할 때, 호출되는 생성자를 복사 생성자라고 하며, 이 생성자는 다음과 같은 형태로 정의됩니다.CSomething( const CSomething& other ){ // do something...}여기..

2025. 3. 30.
C++

[C++] null 포인터와 nullptr 리터럴( literal )

null 포인터( pointer )포인터( pointer )는 객체의 메모리 주소를 저장하는 변수입니다.그리고 아래와 같이, 포인터 ptr이 객체 x의 주소를 저장하고 있는 상태를, "포인터 ptr이 객체 x를 가리키고 있다"라고 얘기합니다.int x = 0;int* ptr = &x; // 객체 x를 주소를 저장 그런데, 포인터는, 참조( reference )와 달리, 현재 가리키고 있는 객체가 없을 수도 있습니다.이러한 포인터를 null 포인터( pointer )라고 합니다. 그리고, null 포인터를 만드는 방법은 다음과 같이 선언하는 것입니다.int* null_pointer{}; // value-list initialization위의 값-리스트 초기화는, 리스트 초기화( list initializa..

2025. 3. 26.
C++

[C++] C-style 문자열의 특징

C-style 문자열C++을 처음 배울 때, 대부분 아래와 같은 예문을 보게 됩니다.#include int main(){ std::cout 그리고, 이 예문에 사용된 "Hello, world!"가 C-style 문자열입니다. 이것을 좀 더 정확하게 정의하자면,C-style 문자열은 문자열 타입을 가진 리터럴( literal )이다라고 할 수 있습니다. 여기서, 문자열 타입이란 문자 배열( char array )을 말하고, 리터럴( literal )은 값을 직접 나타내는 프로그램 요소를 가리키는 단어입니다. 아래의 예제들을 통해, 이러한 리터럴의 개념을 알 수 있습니다.#include int main(){ int variable = 10; // integer literal ..

2025. 3. 25.
C++

[C++] 초기화( initialization )의 세 가지 방법

변수의 초기화( initialization )C++을 사용해서, 코딩을 하다 보면 의외로 다양한 방법으로 변수를 초기화할 수 있음을 알게 됩니다. 그런데, 대부분은 자기만의 특정한 방식의 초기화 방법을 선호하고, 또 그렇게 하더라도 문제가 되는 일이 거의 없습니다. 그렇지만, 초기화의 방법 간에 미묘한 차이점이 있기 때문에, 한 가지 방법만으로는 모든 상황을 만족시킬 수는 없는 경우가 있습니다. C++에서 변수를 초기화려면, 아래의 세 가지 중에 한 가지 방법을 사용할 수 있습니다. 복사 초기화( copy initialization )직접 초기화( direct initialization )리스트 초기화( list initialization ) 아무리, 초기화의 방법이 복잡하고 다양해 보이더라도 결국은 이..

2025. 3. 23.
C++

[C++] 변환 생성자와 암시적인 변환을 금지하는 explicit

변환 생성자( converting constructor )변환 생성자는 암시적인 타입 변환을 위해 호출되는 생성자를 말합니다. 먼저, 암시적인 타입 변환의 예를 보겠습니다.void printVal(double val){ cout main 함수에서 printVal 함수를 int 타입의 인자로 호출하게 되면, 컴파일러는 먼저 int 타입 매개 변수를 가진 함수를 찾습니다. 만약, 그러한 함수가 없다면 "숫자 변환 규칙"에 따라, int 타입을 대신할 수 있는 타입( 여기서는 double )을 매개 변수로 가진 함수를 찾아서 호출하려고 합니다.그렇게 하기 위해서, 컴파일러는 자동으로 int 타입의 값을 double 타입의 값으로 변환합니다.이것이 암시적인 타입 변환( implicit type conve..

2025. 3. 21.
C++

[C++] C-style 타입 변환과 C++의 static_cast

암시적인 타입 변환과 명시적인 타입 변환암시적인 타입 변환( implicit type conversion )은 변수나 표현식의 타입이 일치하지 않는 경우, 컴파일러가 자동으로 필요한 타입으로 변경하는 것을 말합니다. 아래의 예문에서 암시적인 형 변환을 보여줍니다.int main(){ double val = 10 / 4; // 암시적인 형 변환 cout ▼출력double type value: 2위에서, 컴파일러는 10/4의 int 값을, double 타입의 변수에 대입하기 위해서, 자동으로 double 타입의 값으로 변경합니다. 그런데, 위의 결과는 문제가 좀 있네요. val의 값이 2.5가 되기를 기대했지만, 실제는 2가 되었습니다. 이렇게 된 이유는 10/4의 int 연산 수행을 먼저 하고,..

2025. 3. 21.
C++

[C++] const 속성을 제거하는 mutable 키워드

const 멤버 함수와 mutableconst 멤버 함수는 함수 내에서 const 멤버 변수뿐만 아니라, 일반 멤버 변수의 값도 바꿀 수 없도록 제한을 건 클래스 멤버 함수입니다. [C++] 객체를 변경할 수 없는 const 멤버 함수const 멤버 함수C++에서는 기본 타입에 const 키워드를 붙여 값을 변경할 수 없는 변수를 정의할 수 있습니다. 그리고, 이러한 변수는 값을 변경할 수 없으므로, 정의할 때 반드시 초기화 과정을 거codingbonfire.tistory.com그래서, const 멤버 함수 내에서는, 멤버 변수의 값을 수정할 가능성이 있는, 일반 멤버 함수도 사용할 수 없습니다. 하지만, 경우에 따라 멤버 변수의 값을 변경하는 것이 필요한 때가 있습니다. 그때 사용할 수 있는 키워드가 ..

2025. 3. 20.
C++

[C++] 이름 충돌을 해결하기 위한 namespace

namespacenamespace는, 단어에서 알 수 있듯이, 이름( identifier )이 유일하게 정의된 공간을 말합니다.그리고, 이러한 공간을 만드는 이유는, 생각 외로 자주 발생하는 이름의 중복을 막기 위해서입니다. C++에서는 아래와 같이 이름을 가진 두 함수가 같은 파일에 정의되어 있으면 컴파일러 오류가 발생합니다.// main.cpp ----------------------------------------int Compute(int a, int b){ return a + b;}int Compute(int a, int b){ return a - b;}그리고, 이 같은 이름의 두 함수가 각각 다른 파일에 정의되어 있다면 링크 오류가 발생합니다.// myMath1.cpp -------..

2025. 3. 19.
C++

[C++] 모든 타입의 객체를 지시할 수 있는 void 포인터

void 포인터( pointer )void 포인터는 데이터 타입에 구애받지 않는, 메모리를 가리키는 포인터입니다. 일반적인 포인터의 선언은 다음과 같습니다.데이터_타입* 포인터명void 포인터는 위의 "데이터 타입"에 void가 쓰여서, 정해진 데이터 타입이 없다는 것을 나타냅니다.char c;int* pInt = &c; // compile error !!void* pVoid = &c; // ok위에서 char 포인터를 int 포인터에 대입하면 데이터 타입 불일치로 컴파일이 되지 않습니다. 그러나, void 포인터는 메모리 주소이기만 하면 전혀 데이터 타입을 고려하지 않습니다. char*, 배열을 가리키는 포인터, 함수 포인터( function pointer ) 등등 주소를 가리키는 것은 다 담을 수 ..

2025. 3. 18.
C++

[C++] 간단한 함수 객체를 정의하기 위한 람다 표현식( lamda expression )

람다 표현식( lamda expression )줄여서 람다( lamda )라고도 하는 람다 표현식은 익명의 함수 객체를 정의하고 사용하기 위한 표기법입니다. 이 표현식은 간단한 기능을 구현하는데, 너무 많은 손이 가는 것을 막고자 하는 목적으로 C++11부터 도입되었습니다. 다음의 예제는 std::vector의 원소들을 특정 값에 더하는 간단한 코드입니다.#include #include #include using namespace std;int sum = 0; // 전역 변수void add_func(int val){ sum += val;}int main(){ vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; for_each( vec.begin(), vec.en..

2025. 3. 13.
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »

전체 카테고리

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

블로그 인기글

태그

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

티스토리툴바