[C++ STL] std::pair
·
Programming Language(Sub)/C++
std::pair란?두 개의 이질적인 데이터 타입의 값을 하나로 묶어서 저장하는데 사용되는 템플릿 클래스두 개의 값을 리턴해야 해야 하거나, 두 개의 값을 key와 value로 사용하는데 유용하다에 정의되어 있다. std::pair의 구현 방식실제 구현 코드는 아니지만, 이러한 방식으로 구현되어 있다template struct pair { T1 first; T2 second; // 기본 생성자 pair() : first(T1()), second(T2()) {} // 사용자 정의 생성자 pair(const T1& a, const T2& b) : first(a), second(b) {} // 복사 생성자 template pair(const pair& p) :..
[C++] 클래스와 함수의 friend 선언
·
Programming Language(Sub)/C++
friend 선언(클래스, 함수)friend는 친구라는 의미를 가지고 있다.클래스의 friend 선언클래스를 friend로 선언한다는 것은 어떤 의미일까? 예를 들어 클래스 A와 B가 있다고 해보자. 이 때 클래스 A가 "클래스 B는 내 믿을만한 친구야."라고 컴파일러에게 알려준다. 그러면 클래스 B에서 클래스 A의 모든 멤버(private까지)를 접근할 수 있게 된다A 클래스가 B 클래스를 friend 클래스로 선언하면, B 클래스는 A 클래스의 private 멤버까지 직접 접근이 가능하다.a.GetX()가 아니라 a.x 이런식으로 직접 접근이 가능해진다반대로 A 클래스가 B 클래스의 private멤버까지 직접 접근을 하기 위해서는 B 클래스에서 A 클래스를 frined 클래스로 선언해줘야 한다즉, 클..
[C++] 스마트 포인터
·
Programming Language(Sub)/C++
스마트 포인터스마트 포인터를 이용하면 동적할당된 메모리를 알아서 지워준다3가지 종류 존재unique_ptrshared_ptrweak_ptrunique_ptrint *a = new int(5);를 스마트 포인터를 이용하여 동적할당해보자#include #include using namespace std;int main() { // int *a = new int(5);를 스마트 포인터를 이용하여 생성해보자 // 다음은 불가능 // unique_ptr a = new int(5); unique_ptr a(new int(5));}unique_ptr a = new int(5);은 불가능함이 경우 변환 생성자가 호출되는데, 스마트 포인터의 경우 묵시적 형변환이 불가능하기 때문따라서 생성자를..
[Modern C++] 함수 객체와 람다식
·
Programming Language(Sub)/C++
함수 객체와 람다식함수 객체 : 함수처럼 작동하는 객체 (function object/functor)예제 코드를 보기 전에 알아야 하는 내용이 있다.bool f(int x) { //}int main() { f(1);}f(1)에서의 소괄호 ()는 연산자임을 기억하자.(물론 f는 객체가 아니긴 하지만) f.operator()(1); 이런 식으로 연산자를 호출해서 작동을 한다.그래서 소괄호 연산자에 대해서도 오버로딩을 해줄 수가 있다.#include using namespace std;class Equals { public: Equals(int value) : value(value) {} bool operator()(int x) const { return x == ..
[C/C++] 함수 포인터
·
Programming Language(Sub)/C++
함수 포인터모든 명령어들은 전부 0과 1로 메모리에 저장이 되기 때문에, 메모리 저장 공간의 주소를 가지고 있다함수 포인터는 함수에 대한 포인터를 가지고 있다.bool compare(int a, int b) { return a == b;}int main() { bool (*fp)(int, int); int *a;}int *a를 a를 역참조하면 int형이 나온다라고 해석할 수 있다.이런 것처럼 fp를 역참조를 하면 bool을 리턴하고 int 2개를 매개변수로 받는 함수다 라고 해석할 수 있다.fp는 int 2개를 받고 bool을 반환하는 함수를 가리키는 포인터이다.bool compare(int a, int b) { return a == b;}int main() { bool (*f..
[C++] 예외 처리(Exception handling)
·
Programming Language(Sub)/C++
예외 처리(Exception Handling)예외 Caseex) 파일이 제대로 열리지 않는 경우 ex) 데이터 포맷이 맞지 않아 데이터를 받을 수 없는 경우Factorial을 구하는 함수#include using namespace std;int fact(int n) { if (n == 0) return 1; return n * fact(n - 1);}int main() { int n; cin >> n; if (n 이렇게 사용자가 실수로 음수를 입력할 수 있다.n이 음수인 경우 fact함수가 실행되지 않도록 처리를 해줘야 함#include using namespace std;int fact(int n) { if (n == 0) return 1; return n * fa..
[C++] 템플릿 특수화와 비타입 파라미터
·
Programming Language(Sub)/C++
템플릿 특수화와 비타입 파라미터템플릿 특수화지난 시간에 함수 템플릿을 다루면서 아래 코드를 봤을 거에요#include #include using namespace std;template T getArraySum(const T arr[], int n) { T sum = arr[0]; for (int i = 1; i ssumd에서 hello, world, luna 사이에 공백을 넣어주고 싶다.이는 일반적인 함수 템플릿으로는 불가능하다템플릿 특수화를 통해서 템플릿 파라미터에 특정 타입이 들어왔을 때 다른 식으로 특수하게 작동하도록 만들어 줄 수 있다.#include #include using namespace std;template T getArraySum(const T arr[], int n) {..
[C++] 함수 템플릿과 클래스 템플릿
·
Programming Language(Sub)/C++
함수 템플릿과 클래스 템플릿함수 템플릿배열의 합을 구하는 예제를 봐보자#include using namespace std;int getArraySum(const int arr[], int n) { int sum = 0; for (int i = 0; i int 형이 아닌 float 타입등 여러 자료형으로 이루어진 배열의 합을 구하고 싶은 경우가 있을 것이다.이 때 Overloading을 통해서 float getArraySum이라는 함수를 또 만들어 줘야 한다#include using namespace std;int getArraySum(const int arr[], int n) { int sum = 0; for (int i = 0; i float 자료형 이외에도 다른 자료형의 합을 구..
[C++] 정사각형-직사각형 문제
·
Programming Language(Sub)/C++
정사각형-직사각형 문제앞에서 다이아몬드 문제에 의한 객체지향의 한계점을 살펴봤다면, 이번에는 정사각형-직사각형 문제로부터 객체지향의 한계점을 살펴보자#include using namespace std;class Rectangle { // 직사각형 public: Rectangle(double a, double b) : a(a), b(b) {} private: double a, b;};class Square { // 정사각형 public: Square(double a) : a(a) {} private: double a;};정사각형 is a 직사각형네 변의 길이 모두따라서 정사각형과 직사각형을 상속관계로 구현해보자정사각형 is a 직사각형 이므로, 정사각형은 직사각형으로..
[C++] 다중 상속과 다이아몬드 문제
·
Programming Language(Sub)/C++
다중 상속과 다이아몬드 문제한 클래스가 여러 부모를 가지고 있는 경우를 다중 상속이라고 한다cf) 자바와 C#은 다중 상속을 허용하지 않음#include using namespace std;struct Mom { int a = 1;};struct Dad { int b = 2;};struct Child : Mom, Dad { int c = 3;};int main() { Child ch; cout 여기까지는 문제가 없다.만약 Dad의 멤버 변수가 b가 아니라 a라면?#include using namespace std;struct Mom { int a = 1;};struct Dad { int a = 2;};struct Child : Mom, Dad { int c = ..