Lec 01. C++ 표준 라이브러리

2020. 4. 8. 20:03Programming/C ++

enum


enum: 변수에 지정할 수 있는 값의 범위를 엄격하게 제한

enum PieceType { PieceKing = 1, PieceQueen, PieceBook = 10, PiecePawn, };
  • 내부적으로 정숫값으로 표현 (첫 값: 0)

  • 사칙연산, 정숫값처럼 다루는 코드 X

 

엄격한 열거 타입: enum class

enum class PieceType
{
	King = 1,
	Queen,
	Rook = 10,
	Pawn
};
  • 스코프(유효 범위)가 자동으로 확장되지 않는다.

     - PieceType piece = PieceType::King

  • 자동으로 정수 타입으로 변환되지 않는다.

     - if (PieceTyhpe::Queen == 2) { ... } -> 불가능

 

 

함수 리턴 타입 추론


c++14부터는 함수의 리턴 타입을 컴파일러가 알아서 지정할 수 있다. (return type 자리에 auto 키워드를 넣는다.)

auto addNumbers(int num1, int num2)
{
	return num1 + num2;
}
  • 컴파일러는 return 문에 나온 표현식의 타입에 따라 리턴 타입을 추론한다.

  • 재귀함수 X -> 타입을 추론하기 전에 return을 해버린다.

 

 

현재 함수 이름


함수마다 내부적으로 __func__ 라는 로컬 변수가 정의되어 있다.

int addNumbers(int num1, int num2)
{
	std::cout << "Entering function: " << __func__ << std::endl;
	return num1 + num2;
}
  • 현재 함수의 이름을 값으로 갖고 있다.

  • 주로 로그를 남기는데 사용한다.

 

 

배열


C 스타일 배열

int myArray[3] = { 0, 1, 2 };

 

C++ 스타일 배열

#include <array>

std::array 고정 컨테이너

std::array<int, 3> arr = { 0, 1, 2 };
std::cout << "Array size: " << arr.size() << std::endl;
std::cout << "2nd element: " << arr[1] << std::endl;

 

[장점]

  1. 항상 크기를 정확히 알 수 있다.

  2. 자동으로 포인터를 캐스팅(동적 형변환) 하지 않아서 특정한 종류의 버그를 방지할 수 있다.

  3. 반복자(iterator)로 배열에 원소에 대한 반복문을 쉽게 작성할 수 있다.

 

 

std::vector


#include <vector>

 

저장 공간의 크기가 고정적인 컨테이너 중 하나로 C 스타일의 배열을 대체할 수 있으며 훨씬 유연하고 안전하다.

std::vector<int> myVector = { 11, 22 };

myVector.push_back(33);
myVector.push_back(44);

std::cout << "1st element: " << myVector[0] << std::endl;

 

 

 

구조적 바인딩


C++17에 구조적 바인딩이라는 개념이 도입되었다.

구조적 바인딩을 이용하면 여러 개의 변수를 언언할 때 배열, 구조체, 페어 또는 튜플의 값으로 초기화할 수 있다.

// 1
std::array<int, 3> values = { 11, 22, 33 }; 
auto [x, y, z] = values;

// 2
struct Point { double mX, mY, mZ; };

Point point;
point.mX = 1.0; point.mY = 2.0; point.mZ = 3.0;
auto [x, y, z] = point;

 

구조적 바인딩 사용하기: 프로젝트 - 속성 - 구성속성 - C/C++ - 명령줄(Command Line) - 추가옵션에 /std:c++17 입력 후 적용

 

 

 

범위 기반 for문


컨테이너에 담긴 원소에대한 반복문을 실행하는데 편리하다.

반복자를 리턴하는 begin()과 end() 메서드가 정의된 모든 타입에 적용할 수 있다. (array, vector ...etc)

std::array<int, 4> arr = { 1, 2, 3, 4 };
for (int i : arr)
{
	std::cout << i << std::endl;
}

 


String

포인터와 동적 메모리 - 스택과 힙

포인터 사용법

동적 배열 할당



 

 

 

스마트 포인터