일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 깃
- C# delegate
- 구조체
- HTML
- C언어 포인터
- github
- 도커
- c# winform
- dart 언어
- Python
- Unity
- c# 윈폼
- c# 추상 클래스
- 유니티
- 다트 언어
- docker
- 포인터
- Flutter
- c언어
- gitlab
- c#
- 플러터
- C++
- git
- jupyter
- Houdini
- jupyter lab
- Algorithm
- Data Structure
- vim
- Today
- Total
목록전체 글 (507)
nomad-programmer
템플릿을 정의할 때 결정되지 않은 자료형을 의미하는 용도로 사용되는 T 또는 T1, T2와 같은 문자를 가리켜 '템플릿 매개변수' 라 한다. 그리고 템플릿 매개변수에 전달되는 자료형 정보를 가리켜 '템플릿 인자' 라 한다. 템플릿 매개변수에는 변수의 선언이 올 수 있다. template class SimpleArray { private: T arr[len]; public: T& operator[] (int idx) { return arr[idx]; } }; 이렇듯 템플릿 매개변수에도 변수가 올 수 있다. 그리고 이를 기반으로 다음의 형태로 객체생성이 가능하다. SimpleArray i5arr; SimpleArray d7arr; 위의 두 문장에서 템플릿 매개변수 len에 전달된 인자 5와 7은 해당 템플릿..
클래스 템플릿의 특수화 방법 및 개념은 함수 템플릿과 매우 유사하다. 클래스 템플릿 특수화 함수 템플릿을 특수화하는 이유는 특정 자료형에 대해서 구분이 되는 다른 행동을 보이기 위해서다. 마찬가지로 클래스 템플릿을 특수화하는 이유는 특정 자료형을 기반으로 생생도니 객체에 대해, 구분이 되는 다른 행동양식을 적용하기 위해서이다. 즉, 클래스 템플릿을 특수화하면, 템플릿을 구성하는 멤버함수의 일부 또는 전부를 다르게 행동하도록 정의할 수 있다. 클래스 템플릿을 특수화하는 방법은 다음과 같다. 먼저 다음과 같이 정의된 클래스 템플릿이 존재할 때, template class SoSimple { public: T SimpleFunc(T num) { ... } } 이를 기반으로 자료형 int에 대해 특수화 한 템플..
클래스 템플릿의 정의방법은 함수 템플릿의 정의방법과 동일하다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; template class Point { private: T xpos, ypos; public: explicit Point(const T x = 0, const T y = 0) : xpos(x), ypos(y) {} void ShowPosition() const { cout
함수 템플릿과 템플릿 함수 다음의 정의를 가리켜 '함수 템플릿(Function Template)' 이라 한다. template T Add(T num1, T num2) { return num1 + num2; } 반면 위의 템플릿을 기반으로 컴파일러가 만들어 내는 다음 유형의 함수들을 가리켜 '템플릿 함수(Template Function)' 이라 한다. int Add(int a, int b) { return num1 + num2; } double Add(double num1, double num2) { return num1 + num2; } 템플릿 함수의 표시에서 와 은 일반함수가 아닌, 컴파일러가 만들어낸 템플릿 기반의 함수임을 표시한 것이다. 함수 템플릿 함수를 만드는데 사용되는 템플릿 템플릿 함수 템플..
C++ 표준 라이브러리에는 string이라는 이름의 클래스가 정의되어 있다. 해당 클래스는 문자열의 처리를 목적으로 정의된 클래스이며, 이 클래스의 사용을 위해서는 헤더파일 을 포함해야 한다. #include #include usging namespace std; int main(void) { string str1 = "C++ "; string str2 = "Language Love"; string str3 = str1 + str2; cout
C++에서는 객체간의 대입연산을 허용한다. 당연하게도 두 객체의 자료형이 일치할 때에만 대입연산이 가능하다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Number { private: int num; public: Number(int n = 0) : num(n) { cout
함수 호출에 사용되는 인자의 전달에 사용되는 ( )도 연산자이므로 오버로딩이 가능하다. 그리고 이 연산자를 오버로딩 하면, 객체를 함수처럼 사용할 수 있게 된다. adder(5, 7); 객체의 이름이 adder이고 이 객체에 ( )연산자가 멤버함수로 오버로딩 되어 있는 상태라면, 다음과 같이 해석된다. adder.operator()(5, 7); 연산자가 ( )이니 멤버함수의 이름은 operator()이다. 그리고 함수에 전달되는 인자의 정보는 5와 7이다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Point { private: int xpos, ypos; public: exp..
스마트 포인터란 말 그대로 똑똑한 포인터이다. 그리고 스마트 포인터는 객체이다. 포인터의 역할을 하는 객체를 뜻한다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Point { private: int xpos, ypos; public: explicit Point(const int x = 0, const int y = 0) : xpos(x), ypos(y) { cout
new와 delete도 연산자이기 때문에 오버로딩이 가능하다. new 연산자 기본적으로 제공되는 new 연산자가 하는 일은 다음과 같다. 메모리 공간의 할당 생성자의 호출 할당하고자 하는 자료형에 맞게 반환된 주소 값의 형 변환 이 중 세 번째 내용은 C언어에서 사용하면 malloc함수와 달리, new 연산자가 반환하는 주소 값을 형 변환할 필요가 없음을 의미한다. new 연산자의 오버로딩은 1번에 해당하는 메모리 공간의 할당만 오버로딩할 수 있다. 나머지 두 가지 작업은 C++ 컴파일러에 의해 진행이 되며, 오버로딩할 수 있는 대상도 아니다. new 연산자 오버로딩은 다음과 같이 오버로딩 하도록 이미 약속이 되어있다. void* operator new(size_t size) { ... } 반환형은 반드..
#include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class BoundCheckIntArray { private: int* arr; int arrlen; explicit BoundCheckIntArray(const BoundCheckIntArray& ref) {} BoundCheckIntArray& operator=(const BoundCheckIntArray& ref) {} public: explicit BoundCheckIntArray(int len) : arrlen(len) { arr = new int[len]; } ~BoundCheckIntArray() { delete[]..
함수 호출관계 모호함은 다음과 같은 상황에서도 발생할 수 있다. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Base { public: explicit Base() { cout