목록2024/07 (28)
미누에요

문제 스마트 포인터class SmartPtr{private: Point *posptr;public: SmartPtr(Point * ptr):posptr(ptr){} Point& operator*() const{ return *posptr; } Point* operator->() const{ return posptr; } ~SmartPtr(){ delete posptr; }}; 이 스마트 포인터를 템플릿으로 정의하여, 어떠한 클래스의 객체도 참조할 수 있는 포인터가 되게 하자.그리고 아래의 Point클래스와 main 함수를 기반으로 예제를 완성해보자. class SmartPtr{private: Point *posptr;p..

문제 1인자로 전달되는 두 변수에 저장된 값을 서로 교환하는 SwapData라는 이름의 함수를 템플릿으로 정의해보자.그리고 다음 Point클래스를 대상으로 값의 교환이 이뤄짐을 확인할 수 있도록 main 함수를 구성해보자. class Point{private: int xpos, ypos;public: Point(int x = 0,int y=0):xpos(x),ypos(y){} void ShowPosition() const{ cout 정답#includeusing namespace std;class Point{private: int xpos, ypos;public: Point(int x = 0,int y=0):xpos(x),ypos(y){} void ShowP..

이번에는 포인터 연산자를 오버로딩해보겠다. 우선 *연산자와 -> 연산자의 특징들을 알아보자 *연산자예시 ) *num포인터 변수의 실제 값을 반환 -> 연산자예시 ) num->~~포인터 변수의 주소값을 반환 이 특징들을 살려서 연산자 오버로딩을 해보겠다. int형 값을 담는 Number 클래스를 만들어 작성해보겠다. #includeusing namespace std;class Number{private: int num;public: Number(int n):num(n){} void ShowData() { cout (){ return this; } Number& operator*(){ return *this; }}; 위 코드에서 연산자 오버로..

이번에는 new 연산자를 오버로딩 해보겠다. 우선, new 연산자의 역할을 먼저 알아보자면 아래와 같다.메모리 공간의 할당생성자의 호출할당하고자 하는 자료형에 맞게 반환된 주소 값의 형 변환 위 세 가지 역할 중에서 우리는 메모리 공간의 할당에 해당되는 부분만 오버로딩을 할 수 있다.다른 두 가지는 컴파일러의 역할이기 때문이다. 메모리 공간의 할당에 대한 순서를 알아보면,필요한 메모리 공간을 계산계산된 크기의 값을 인자로 전달하여 operator new 호출 operator new우선 new 연산자 오버로딩에서는 필수적으로 지켜저야 할 것이 있다.매개변수로 들어가는 인자는 size_t 이어야 한다.반환형은 void * 이어야한다.인자로 전달하는 size는 바이트 단위로 전달되어야 한다.위 조건을 지켜서..

배열은 인덱스 연산자를 사용하여 해당 인덱스의 값을 반환하게 된다. 예를 들어서, int arr[5] = {1,2,3,4,5};cout 위 코드에서 arr[3]은 arr 배열의 4번째 인덱스, 즉 4를 반환하고, 그것을 출력하게 된다. 이처럼 배열 인덱스 연산자인 [] 는 해당 인덱스의 값을 반환하는 역할을 한다.하지만, 이러한 배열에서 해당하지 않는 인덱스의 값을 반환하려 하면 에러가 발생하고 프로그램이 종료된다. 우리는 이 인덱스 연산자의 단점인 해당하지 않는 인덱스에 접근하는 경우를 수정하여 배열의 인덱스 연산자를 오버로딩 해보겠다. operator[]기본적인 형태는 아래와 같다.int& operator[](int idx){ return arr[idx];} 우리는 int형 배열에 대한 인덱스 ..

문제 1예제 StablePointPtrArray.cpp 65, 66행을 다음과 같이 구성할 수 있도록 Point 클래스를 대상으로 연산자 오버로딩을 진행해보자.for(int i=0;i 물론, 실행결과에는 변함이 없도록 연산자를 오버로딩 해야한다. 이 문제의 해법은 출력 연산자 오버로딩을 하나 더 생성하는 것에 있다. 정답#includeusing namespace std;class Point{private: int xpos, ypos;public: Point(int x=0, int y=0):xpos(x),ypos(y){} friend ostream &operatorxpos ypos arrlen){ cout 실행 결과 문제 2 class BoundChec..

문제 1Chapter 07에서는 예제 HASComposite.cpp를 통해서 다음의 두 클래스를 정의하였다. HASComposite.cppclass Gun{private: int bullet;public: Gun(int bnum):bullet(bnum){} void Shot(){ cout 0) pistol = new Gun(bnum); else pistol = NULL; } void PutHandcuff(){ cout Shot(); } ~Police(){ if(pistol!=NULL) delete pistol; }}; 이에 Police 클래스를 대상으로 ..

이번에는 입력과 출력을 담당하는 연산자에 대해서 오버로딩을 해 보겠다. class Point{private: int xpos, ypos;public: Point(int x = 0, int y = 0):xpos(x),ypos(y){} void ShowPosition() const{ cout 이번에도 Point 클래스를 활용하여 보자. 위의 Point 클래스의 경우에, 출력을 아래와 같이 했을 때 어떻게 출력되는 게 좋겠는가 ?cout 아마 ( 3 , 4 ) 혹은 [ 5, 3 ]과 같이 괄호, 그리고 콤마와 함께 출력되는 것이 Point클래스를 잘 출력하는 방법이 될 것이다. 이렇게 출력되도록 입출력 연산자를 오버로딩할 수 있다. 그러기 위해서는 ostream과 istrea..

수학에서 교환법칙은 아래 식을 의미한다.a + b = b + a 순서가 바뀌어도 연산의 결과는 동일하다는 말이다. 연산자 오버로딩에서는 이러한 교환법칙이 가능하지 않다.예를 들어 멤버함수로의 + 연산자 오버로딩에서,pos1 + pos2; 위 코드는 아래처럼 변환된다. pos1.operator+(pos2); 하지만, 둘의 순서가 바뀐다면,pos2 + pos1; 결과는 달라지게 된다.pos2.operator(pos1); 위와 같이, 연산자 오버로딩에서는 기본적으로 교환법칙이 성립하지 않는다. 하지만 몇 줄의 코드로 교환법칙이 성립하게끔 바꿀 수 있다.그에 대해서 설명하겠다. 연산자 오버로딩에서 교환법칙을 가능하게 만드는 방법전역함수 혹은 멤버함수로 하나 더 구현!#includeusing namespa..

후위 연산자해당 라인의 다른 연산이 모두 끝나고 나서 증감연산자를 계산한다는 특징이 있다.반환은 현재 값, 그리고 원래 값은 1 증가시키는 형태이다. 이러한 후위 연산자는 단순히 1을 증가시키거나 감소시키는 것이 아니라 반환은 증감 전의 값, 반환과 별개로 원래의 값을 증감시켜야 하기 때문에 보다 복잡하다고 생각할 수 있다. operator++ (O)++operator (X) 연산자 오버로딩을 할 때는 operator 뒤에 무조건 오버로딩할 연산자를 작성해야 한다.이러한 이유 때문에 전위 연산자와 후위 연산자를 구분하지 못하는 문제점도 발생한다. 이러한 문제점들을 해결할 방법을 코드를 통해 알아보자. 후위 연산자 오버로딩operator++(매개변수, int)operator--(매개변수, int)i..