참조자의 도입 C 언어에서는 어떠한 변수를 가리키고 싶을 때 반드시 포인터를 사용해야만 함 C++에서는 참조자도 사용 가능 > 실행 결과 5 3 > 실행 결과 a : 5 anotherA : 5 레퍼런스의 특징 반드시 처음에 누구의 별명이 될 것인지를 지정해야 함 레퍼런스가 한 번 별명이 되면 절대로 다른 이의 별명이 될 수 없다. 레퍼런스는 메모리...
malloc, free 그리고 new, delete C++에서도 C언어에서 사용한 malloc과 free를 사용하여 힙 메모리에 할당 가능 하지만, C++ 언어 차원에서 지원하는 것은 new와 delete임 new는 malloc에 대응대는 것으로 메모리를 할당하고, delete는 free에 대응되는 것으로 메모리를 해제함 > new 사용 방법 T* poi...
객체 변수들과 참고 자료들로 이루어진 소프트웨어 덩어리 캡슐화 외부에서 직접 인스턴스 변수의 값을 바꿀 수 없고, 인스턴스 메소드를 통해서 간접적으로 조절하는 것 클래스 C++상에서 객체를 만들 때 사용 Date 클래스 만들기 >실행 결과 2012.3.3
함수의 오버로딩 오버로딩의 사전적 의미 과적하다 sb (with sth) 너무 많이 주다 ✔️ (컴퓨터, 전기 시스템 등에) 과부화가 걸리게 하다 함수의 오버로딩 -> 함수에 과부화를 주는 것 C++에서는 같은 이름의 함수를 호출했을 때 어떻게 구분할까? 함수 호출 시 사용하는 인자를 보고 결정함 -> C++에서는 함수의 이름이 같더라도 인자가 다르면 ...
소멸자 >~클래스의 이름(); 소멸자는 생성자와 달리 인자를 아무것도 가지지 않음 -> 즉, 오버로딩이 되지 않음 복사 생성자 >T(const T& a); 다른 T의 객체 a를 상수 레퍼런스로 받음 a는 cont 이므로 복사 생성자 내부에서 a의 데이터를 변경할 수 없고, 오직 새롭게 초기화되는 인스턴스 변수들에게 '복사'만 할 수 있게 됨 >실행 결과...
생성자의 초기화 리스트 (initializer list) >실행 결과 * Marine * Location : ( 2 , 3 ) HP : 50 * Marine * Location : ( 3 , 5 ) HP : 50 비교 위와 같이 생성자 이름 뒤에 : 멤버변수(값), ... 형식으로 오는 것을 초기화 리스트라고 부르며, 생성과 동시에 멤버 변...
static 멤버 변수 클래스의 static 멤버 변수는 객체가 소멸될 때 소멸되는 것이 아닌 프로그램이 종료될 때 소멸됨 클래스의 모든 객체들이 '공유'하는 변수로써 각 객체 별로 따로 존재하는 멤버 변수들과는 달리 모든 객체들이 '하나의' static 멤버 변수를 사용하게 됨 모든 전역 및 static 변수들은 정의와 동시에 값이 자동으로 0으로 초기...
암시적 변환(implicit conversion) myString에 미리 크기를 할당 받는 새로운 생성자 추가 암시적 변환의 문제점 사용자의 실수로 doSomethingWithString 함수의 인자로 숫자를 전달하는 경우 컴파일러는 myString(int capacity)가 있으므로 오류로 판단하지 않음 즉, 사용자가 의도하지 않은 암시적 변환이 일어...
연산자 오버로딩 >(리턴 타입) operator(연산자) (연산자가 받는 인자) 기존에 만든 myString에 위 함수를 만든 후 아래와 같이 main 함수 실행 >실행 결과 st1 와 str2 는 다르다. str2 와 str3 는 같다. 복소수(Complex number) 클래스 만들기 >실행 결과 ( 7 , 4 ) 값을 리턴하는 연산자 함수 ...
C++ 스타일의 캐스팅 기존의 C언어 캐스팅 방법 : 암시적, 명시적 캐스팅 명시적 캐스팅은 말도 안되는 캐스팅에 컴파일러가 오류를 발생시키지 않음 (프로그래머의 실수에 취약) 명시적 캐스팅은 코드의 가독성이 떨어짐 (예) function((int)variable); C++의 캐스팅 방법 (1) static_cast : 언어적 차원에서 지원하는 일반적인 ...
상속 >실행 결과 === 기반 클래스 생성 === 기반 클래스 === 파생 클래스 생성 === 기반 클래스 파생 클래스 기반 생성 시 부모가 있는 경우 부모의 생성자가 호출된 뒤 자식 생성자가 호출됨 부모 클래스의 모든 정보를 상속 받았기 때문에 Derived에서도 what 호출 가능 Derived에도 what이 있다면? >실행 결과 기반 클래스...
is a와 has a 업캐스팅 >실행 결과 기반 클래스 기반 클래스 파생 클래스 포인터 버전 === 기반 Derived 객체 c는 Base를 상속받은 객체이기 때문에 Base 객체를 가리키는 포인터가 c를 가리켜도 문제 없음 -> 업 캐스팅 다운캐스팅 >컴파일 오류 error C2440: 'initializing' : cannot convert ...
virtual 소멸자 상속 시 소멸자를 가상 함수로 만들어야 함 > 실행 결과 --- 평범한 Child 만들었을 때 --- Parent 생성자 호출 Child 생성자 호출 Child 소멸자 호출 Parent 소멸자 호출 --- Parent 포인터로 Child 가리켰을 때 --- Parent 생성자 호출 Child 생성자 호출 Parent 소멸자 호출 d...
C++ 입출력 라이브러리 C++ 입출력 라이브러리의 구성 ios_base : 스트림의 입출력 형식 관련 데이터 처리 (예) 실수 형을 출력할 때의 정밀도를 어떤 식으로 할건지?, 정수를 몇진수로 출력할지 ios : 스트림 버퍼를 초기화 및 스트림 상태 관리 (참고) 스트림 버퍼 데이터를 내보내거나 받아들이기 전에 임시로 저장하는 곳 사용자가 1바이트 씩...
fstream cout이나 cin은 표준 입출력에 연동 되어 있는 상황이었지만 파일 입출력의 경우 어느 파일에 입출력을 해야 할 지 지정 해야 함 -> 지정 방법은 ifstream 객체의 생성자에 연동하고자 하는 파일의 경로를 전달하면 됨 파일 경로를 지정하면 해당하는 파일을 찾고 열게 됨 만약 파일이 존재하지 않는다면 파일을 열 수 없음 -> 파일이 ...
정규 표현식 문자열에서 패턴을 찾을 때 사용함 정규 표현식을 통해 문자열이 주어진 규칙에 맞는지 확인할 수 있음 db-숫자-log.txt 형태인지 확인하기 실행 결과
형식 연역이란? 컴파일러가 변수나 함수의 타입을 자동으로 추론하는 과정 함수 템플릿 호출 지점, auto, decltype 표현식 등에서 발생함 템플릿 형식 연역 규칙 컴파일러는 expr를 이용하여 T와 paramType을 연역함 (경우 1) paramType이 포인터 또는 참조 형식이지만 보편 참조는 아닌 경우 규칙...
객체 생성 시 괄호와 중괄호를 구분하라 uniform initialization C++은 초기화 할 때 =, (), {}를 지원함 그 중에서 어디서나 사용할 수 있는 것이 중괄호 구문임 (장점) =, ()와 달리 암묵적 좁히기 변환(narrowing conversion)을 방지해 줌 (단점) 종종 예상치 못한 행동을 보임 (예) std::initialize...
0과 NULL보다 nullptr을 선호하라 0 리터럴 0은 int이지 포인터가 아님 포인터만 사용할 수 있는 위치에 0이 있으면 마지못해 nullptr로 해석하긴 하지만 최후의 수단일 뿐임 NULL NULL도 포인터 형식이 아님 nullptr 정수도 포인터 형식도 아님 std::nullptr_t인데 이는 모든 raw pointer 형식으로 암묵적 변환됨...
typedef보다 별칭 선언을 선호하라 typedef, 별칭 선언(alias declaration) |기능|typedef|using| |-|:-:|:-:| |사용자 정의 타입에 새로운 이름 부여|O|O| |별칭 템플릿 가능|X|O| 범위 없는 enum보다 범위 있는 enum을 선호하라 범위 없는 enum 일반적으로 중괄호 쌍 안에서 어떤 이름을 선언하면 ...
정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라 개발자가 특정 함수를 호출하지 못하게 하려면 함수를 선언하지 않는 것이 가장 간단함 하지만 C++이 필요에 따라 자동으로 생성하는 함수는 같은 방법으로 해결할 수 없음 C++98에서는 해당 함수의 접근 지정자를 private으로 변경하여 호출을 방지했음 -> 비공개 함수 C++11에서는 함수의 선언 끝...
#define을 쓰려거든 const, enum, inline을 떠올리자 선행 처리자보다 컴파일러를 더 가까이 하자 #define #define을 사용하면 소스 코드가 컴파일러로 넘어가기 전에 선행 처리자가 기호식 이름을 숫자 상수로 변경함 (사용한 만큼 사본 생성) -> ASPECT_RATIO는 컴파일러가 쓰는 기호 테이블에 들어가지 않기 때문에 디버깅...
낌새만 보이면 const를 들이대 보자 const 어떤 값이 불변이어야 하는 제작자의 의도를 컴파일러 및 다른 프로그래머와 나눌 수 있는 수단 const 키워드가 * 보다 왼쪽에 있으면 포인터가 가리키는 대상이 상수임 * 보다 오른쪽에 있으면 포인터 자체가 상수임 포인터가 가리키는 대상을 상수로 만들 때 두 가지 방법이 있지만 의미적인 차이는 전혀 없음...
iterator 보다 const_iterator를 선호하라 const_iterator const를 가리키는 포인터의 STL 버전 수정하면 안 되는 값을 가리킴 추가학습 begin, end, rbegin 등의 비멤버 함수를 멤버 함수보다 선호하라 C++에서 begin과 end 같은 비멤버 함수 버전을 멤버 함수보다 선호하는 것은 주로 코드의 일관성, 유연성...
예외를 방출하지 않을 함수는 noexcept로 선언하라 noexcept 해당 함수가 예외를 방출하지 않을 것임을 명시하는 키워드 해당 키워드를 사용하면 컴파일러가 더 나은 목적 코드를 산출할 수 있음 C++98에서는 예외 명세가 위반되면 호출 스택이 f를 호출한 지점에 도달할 때까지 풀리며 그 지점에서 몇 가지 동작이 취해진 후 프로그램 실행이 종료됨 C...
C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 컴파일러가 선언해 주는 함수 기본 생성자 소멸자 복사 생성자 복사 대입 연산자 참조자를 데이터 멤버로 갖고 있는 클래스에 대입 연산을 지원하기 위해서는 직접 복사 대입 연산자를 정의해 주어야 함 데이터 멤버가 상수 객체인 경우에도 C++ 컴파일러가 비슷하게 동작함 상수 멤버를 수정하는 것은 ...