목록C++ (79)
미누에요

C++에서 다형성을 이용하여 업캐스팅, 다운캐스팅을 할 때에 우리는 여러가지 형 변환을 사용한다.형 변환 연산자를 사용하지 않아도 형 변환 명시를 통해 형변환이 가능하지만, 의도한 바를 명확히 표시하기 위해 "형 변환 연산자"를 사용한다. 형 변환 연산자의도치 않은 형변환에 의한 데이터 손실을 줄이기 위함컴파일러가 인식하여 이상하면 에러 발생시킬 수 있음 형 변환 연산자의 종류는 총 4가지이다.static_castconst_castdynamic_castreinterpret_cast형 변환 연산자의 사용 방법은 아래와 같다.형 변환 연산자(바꿀 변수) static_cast부모 클래스의 내용을 자식 클래스에 담는 경우(임의로)자식 클래스의 내용을 부모 클래스에 담는 경우(임의로)형 변환을 의도적으로 진행한..

C++에서도 예외 처리에 try, catch, throw를 사용한다. try예외가 발생할 거 같은 지역을 try 속에 넣는다.예외가 발생한다면, 그 지점 아래의 코드는 실행되지 않는다.try{// 예외 발생 예상지역} catchtry 블록에서 발생한 예외(throw로 던져진 예외)를 여기서 catch한다.발생한 에외를 처리하는 부분이다. (에러 출력과 같은 작업)예외가 발생하지 않는다면 실행되지 않는다.catch{// 예외 처리 코드} throw예외가 발생했을 때 throw를 보통 던지도록 설계한다.throw를 던지면 catch가 있는 부분까지 빠져나간다.예외가 발생하면 throw 아래의 코드는 실행되지 않는다.throw 값; 예제 코드를 통해 살펴보자.#includeusing namespace ..

템플릿을 사용해서 함수나 클래스를 작성할 때, 템플릿 변수를 여러 개 작성할 수도 있다. #includeusing namespace std;templatevoid MySimple(T1 v1, T2 v2){ cout 실행 결과 위 함수는 템플릿 변수를 두 개 사용하여 각 메모리 사이즈를 출력하는 함수이다.12는 정수 int형이므로 4바이트, 'B'는 char 형 이므로 1바이트가 출력되었다. 이처럼 상단에 template 의 뾰족괄호 속에 typename을 얼마나 작성하느냐에 따라서 템플릿 변수를 더 많이 사용하여 다양한 매개변수의 타입에 대응할 수 있게된다.

프로그램을 작성하다 보면 자료형에 따라 여러 개의 함수를 만들어야 하는 상황이 발생한다.예를 들어서 덧셈 연산을 하는 프로그램이 있다고 하자.#includeusing namespace std;int Add(int n1, int n2){ cout 실행 결과 위 코드에서는 double 타입의 두 변수를 사용하여 Add 함수를 호출하였다.함수는 매개변수에 따라서 오버로딩이 가능하기에, 우리가 int형 변수 두 개의 덧셈을 계산하려면 위처럼 int 형의 Add 함수를 하나 더 작성해야한다. 이렇게 사용하려는 변수의 타입마다 함수를 하나씩 작성한다면 굉장히 번거로울 것이다. 이럴 때 우리는 템플릿(Template)을 사용하여 코드를 간단히 나타낼 수 있다. 템플릿(Template)템플릿 이라는 단어는..

문제 스마트 포인터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..