| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 29 |
| 30 |
- vim
- c# 추상 클래스
- Python
- 유니티
- docker
- c언어
- Unity
- 포인터
- c# 윈폼
- 다트 언어
- jupyter
- C# delegate
- gitlab
- 깃
- c#
- C++
- C언어 포인터
- 도커
- git
- 구조체
- Data Structure
- dart 언어
- Houdini
- 플러터
- HTML
- Flutter
- github
- Algorithm
- jupyter lab
- c# winform
- Today
- Total
목록Programming/C++ (53)
nomad-programmer
클래스 템플릿의 특수화 방법 및 개념은 함수 템플릿과 매우 유사하다. 클래스 템플릿 특수화 함수 템플릿을 특수화하는 이유는 특정 자료형에 대해서 구분이 되는 다른 행동을 보이기 위해서다. 마찬가지로 클래스 템플릿을 특수화하는 이유는 특정 자료형을 기반으로 생생도니 객체에 대해, 구분이 되는 다른 행동양식을 적용하기 위해서이다. 즉, 클래스 템플릿을 특수화하면, 템플릿을 구성하는 멤버함수의 일부 또는 전부를 다르게 행동하도록 정의할 수 있다. 클래스 템플릿을 특수화하는 방법은 다음과 같다. 먼저 다음과 같이 정의된 클래스 템플릿이 존재할 때, 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
가상함수의 동작원리를 이해하면, C++이 C보다 느린 이유를 조금이나마 알 수 있다. 다음의 예를 살펴보자. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class AAA { private: int num1; public: virtual void Func1() { cout
가상함수 말고도 virtual 키워드를 붙여줘야 할 대상이 하나 더 있다. 그것은 바로 '소멸자'이다. 즉, virtual 선언은 소멸자에도 올 수 있다. 가상 소멸자(Virtual Destructor) virtual로 선언된 소멸자를 가리켜 '가상 소멸자'라 부른다. 다음의 예를 살펴보자. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class First { private: char* strOne; public: explicit First(const char* str) { cout
함수를 override 했다는 것은, 해당 객체에서 호출되어야 하는 함수를 바꾼다는 의미이다. 하지만 포인터 변수의 자료형에 따라 호출되는 함수 종류가 달라지는 것은 문제가 있다. 다음의 예제를 보자. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class First { public: void MyFunc() { cout