'프로그래밍 > C#' 카테고리의 다른 글
(C#) Head First - 캡슐화 PartyPlaner (0) | 2016.07.09 |
---|---|
(C#) Head First - 캡슐화 (0) | 2016.07.09 |
(C#) head first - MessageBox 사용 (0) | 2016.07.09 |
(C#) Head First - 경마 (0) | 2016.07.09 |
(C#) 엑세스 수식자, 예외처리 (0) | 2016.07.09 |
(C#) Head First - 캡슐화 PartyPlaner (0) | 2016.07.09 |
---|---|
(C#) Head First - 캡슐화 (0) | 2016.07.09 |
(C#) head first - MessageBox 사용 (0) | 2016.07.09 |
(C#) Head First - 경마 (0) | 2016.07.09 |
(C#) 엑세스 수식자, 예외처리 (0) | 2016.07.09 |
엑세스 수식자
액세스 수식자 | 의미 |
public | 다른 객체에서 액세스 가능 |
private(또는 생략) | 다른 객체에서 액세스 불가능 |
protected | 상속한 클래스에서만 액세스 가능 |
internal | 구성단위에서만 액세스 가능 |
지시자 ref, out의 차이
ref는 c,c++의 주소참조를이용한 호출 초기화를 해야 사용가능
out은 출력인자를 이용한 호출 초기화를 안해도 사용가능
예외처리
try{
예외가 발생할지도 모르는 처리
}
catch(예외 클래스명 변수명){
예외 발생 시에 실행하는 처리
}
finally{
뒷마무리 작업->메소드의 호출 원본으로
}
예외 클래스 | 의미 |
DivideByZeroException | 0으로 나누었다. |
IndexOutOfRangeException | 첨자가 배열의 범위를 초과했다. |
InvalidCastException | 실행할 때 형변환이 올바르지 않다. |
NullReferenceException | 값이 null인 객체 변수를 참조했다. |
OutOfMemoryException | 메모리 여유 공간이 부족하여 호출에 실패햇다. |
OverflowException | 오버플로가 발생했다. |
FileNotFoundException | 존재하지 않는 파일에 액세스하는데 실패했다. |
Exception | 모종의 예외가 발생했다. |
throw 예외를 의도적으로 일으키려고 할경우사용하고 사용시 catch의 인수가 됨 throw 인수;
텍스트 파일 읽을 시
using System.IO 입력
FileStream 클래스
처리 | 의미 |
FileMode.Open | 기존의 파일 열기. |
FileMode..OpenOrCreate | 파일이없으면 만든후 열기. |
FileMode.Append | 추가 기록모드로 연다. 없으면 생성 |
FileMode..Create | 파일을 만든다. 이름이 중복이면 덮어쓰기 |
FileMode..CreateNew | 파일을 만든다. 이름이 중복이면 예외발생 |
StreamReader 읽기용 클래스
StreamWriter 쓰기용 클래스
BinaryReader 바이너리 읽기용 클래스
BinaryWriter 바이너리 쓰기용 클래스
(C#) Head First - 캡슐화 PartyPlaner (0) | 2016.07.09 |
---|---|
(C#) Head First - 캡슐화 (0) | 2016.07.09 |
(C#) head first - MessageBox 사용 (0) | 2016.07.09 |
(C#) Head First - 경마 (0) | 2016.07.09 |
(C#) WPF로 만든 심플 게임 (1) | 2016.07.09 |
GDI(Graphic Device Interface)
윈도우가 하드웨어를 제어할 수 있도록 응용 프로그램에 제공하는 모든 기능
응용 프로그램과 디바이스 드라이버의 중간 역활
응용 프로그램에 대한 장치 독립적인 그래픽 동작 수행
GDI 기본 구성 요소
선과 곡선 (직선, 사각형, 타원, 호, 등)
채워진 영역 (브러시 개체를 이용 - 색상, 패턴, 비트맵 이미지)
비트맵 (디스플레이 장치의 픽셀과 일치하는 직사각형 배열, 래스터 그래픽의 기본적인 도구)
택스트
DC(Device Context)
1)핸들 역활
애플리케이션과 출력 장치를 연결하는 역활
애플리케이션이 출력에 대한 허가를 얻고, 그려지는 영역을 결정하는 역활
2)GDI에 의해 내부적으로 유지되는 데이터 구조
여러 가지 그래픽 속성에 대한 값(텍스트 속성/색상, 매핑 모드, 글꼴)을 가짐
DC를 사용할 경우 독립적인 하드웨어 출력을 할 수 있어 출력장치에 상관없이 동일한 방법으로 출력을 설정할 수 있음
DC를 사용후 해제(리소스 반환)해야함
DC를 얻는 방법
GDI 객체 사용 방법
[출처] (MFC) 그래픽 객체의 사용|작성자 길가다주은노트북
(MFC) 대화상자 (0) | 2016.07.09 |
---|---|
(MFC) 메시지 처리 (0) | 2016.07.09 |
(C++) 클래스와 객체 (0) | 2016.07.09 |
(C++) Simple 한/영사전 예제 (0) | 2016.07.09 |
(C++) 상속을 이용한 간단한 계산 클래스 구현 (0) | 2016.07.09 |
대화상자 : 사용자와 윈도우간의 인터페이스
CDialogEx 클래스
▲대화상자 계층도
다이얼로그 기반의 프로그램 = 애플리케이션 클래스 + 다이얼로그 클래스로 구성
클래스 | 기저 클래스 | 설 명 |
애플리케이션 클래스 | CWinApp | 프로젝트 전체를 관리하는 클래스 |
다이얼로그 클래스 | CDialogEx | 대화상자의 기능을 구현하는 실제적인 클래스 |
도움말 대화상자 클래스 | CDialogEx | 도움말 정보 클래스 |
▲ 대화 상자 프로그램의 동작 순서
MFC 기본 컨트롤
모달(Modal) 대화상자
모덜리스(Modeless) 대화상자
공용 대화상자
File 대화상자
Font 대화상자
Color 대화상자
[출처] (MFC) 대화상자|작성자 길가다주은노트북
(MFC) 그래픽 객체의 사용 (0) | 2016.07.09 |
---|---|
(MFC) 메시지 처리 (0) | 2016.07.09 |
(C++) 클래스와 객체 (0) | 2016.07.09 |
(C++) Simple 한/영사전 예제 (0) | 2016.07.09 |
(C++) 상속을 이용한 간단한 계산 클래스 구현 (0) | 2016.07.09 |
메시지 : 발생된 이벤트의 종류와 정보를 전달하는 일종의 상수 값
윈도우 프로그래밍에서 가장 중요한 것은 메시지를 처리하는 것
Win32 SDK 프로그램 : 들어온 메시지를 switch문을 사용하여 처리
MFC : 메시지 처리를 위해 메시지 맵을 사용
메시지 맵(Message Map)
메시지 처리 단계 - 클래스 마법사가 2번까지 자동으로 코딩해줌
메시지 핸들러 함수
메시지 유형 | 발생 상황 | 메시지 핸들러 함수 |
WM_CREATE | 윈도우가 생성될 때 | OnCreate() |
WM_ACTIVE | 윈도우가 활성화 될 때 | OnActive() |
WM_PAINT | 윈도우가 다시 그려질 때 | OnPaint() |
WM_SIZE | 윈도우 크기가 변경될 때 | OnSize() |
WM_MOVE | 윈도우가 움직일 때 | OnMove() |
WM_TIMER | 설정된 타이머 시간이 됐을 때 | OnTimer() |
WM_DESTROY | 윈도우가 종료될 때 | OnDestroy() |
▲윈도우 관리 메시지와 메시지 핸들러 함수
[출처] (MFC) 메시지 처리|작성자 길가다주은노트북
(MFC) 그래픽 객체의 사용 (0) | 2016.07.09 |
---|---|
(MFC) 대화상자 (0) | 2016.07.09 |
(C++) 클래스와 객체 (0) | 2016.07.09 |
(C++) Simple 한/영사전 예제 (0) | 2016.07.09 |
(C++) 상속을 이용한 간단한 계산 클래스 구현 (0) | 2016.07.09 |
객체지향 프로그래밍의 특징
다형성과 연산자 오버로딩
상속성
새로운 자료형(클래스) = 데이터의 저장(멤버변수) + 데이터를 처리할 메소드(멤버함수)
기존 C에 있던 구조체(각종 데이터 형의 모음)를 확장한 개념이다.
접근 지정자 | 현재 클래스 | 클래스 밖 |
private | o | x |
public | o | x |
private
public
클래스의 선언
//클래스 선언
class 클래스명{
접근 지정자:
자료형 멤버변수;
접근 지정자:
자료형 멤버함수();
};
//멤버함수 정의
자료형 클래스명::멤버함수(){
}
클래스의 멤버함수 구현
객체 선언과 멤버 참조
클래스명 객체명1,...,객체명n;
클래스 멤버의 접근 방법
객체명.멤버변수;
객체명.멤버함수();
인라인 함수
함수가 호출되는 부분에 함수 내의 코드를 직접 넣어 '매크로' 처럼 처리해주는 예약어
inline 반환타입 클래스명::멤버함수명()
const 상수
변수를 상수로 만들어주는 예약어
값을 바꿀 수 없다.
const 자료형 변수명 = 초기값;
멤버 함수 매개변수 뒤에 const를 붙일 경우 함수 내에서 값을 변경하지 못하게 한다.
함수의 오버로딩
동일한 이름으로 함수를 여러번 정의하여 사용할 수 있다.
같은 의미로 사용하는 함수를 모두 다른 이름으로 정의시 프로그램을 작성할 때 함수명을 개별적으로 외워야함
ex) void print(int); void print(long); void print(int, long);
함수의 디폴트 매개변수
ex) void print(int x=10,int y=20, int z=30)
print(4,5,6); => x=4 y=5 z=6
print(4,5); => x=4 y=5 z=30
print(4); => x=4 y=20 z=30
print(); => x=10 y=20 z=30
생성자
소멸자
[출처] (C++) 클래스와 객체|작성자 길가다주은노트북
(MFC) 대화상자 (0) | 2016.07.09 |
---|---|
(MFC) 메시지 처리 (0) | 2016.07.09 |
(C++) Simple 한/영사전 예제 (0) | 2016.07.09 |
(C++) 상속을 이용한 간단한 계산 클래스 구현 (0) | 2016.07.09 |
(C++) 상속성 (0) | 2016.07.09 |
검색한 단어와 동일한 단어가 존재할 경우 : 한글->영어, 영어->한글 로 변환
없을 경우 : 재검색 하면서 검색단어와 사전의 단어 앞글자가 일치하는 경우를 출력
실행 환경 : 실행파일과 같은 폴더에 dictionaly.txt 파일이 존재할 것
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include<iostream> #include<fstream> #include<string> using namespace std; void main() { ifstream in("dictionaly.txt"); string strDictionaly[100][2], seachWord; char strTemp[100]; int t = 0, cnt = 0; //사전 불러오기 while (1) { in.getline(strTemp, 100); if (!strcmp(strTemp, "-1")) break; if (!t) { strDictionaly[cnt][t] = strTemp; t = 1; } else { strDictionaly[cnt][t] = strTemp; cnt++; t = 0; } } int i, j; bool isSerach; while (1) { cout << "검색할 단어를 입력하세요 (종료 : -1)" << endl; cin >> strTemp; seachWord = strTemp; //종료 메시지일 경우 반복문 탈출 if (seachWord =="-1") { cout << "사전 프로그램을 종료합니다." << endl; break; } //사전 검색 isSerach = false; for (i = 0; i <= cnt; i++) { for (j = 0; j < 2; j++) { //동일한 단어 찾을 경우 탈출 if (strDictionaly[i][j] == seachWord) { isSerach = true; goto a10; } } } a10:; //동일 단어 찾을 경우 if (isSerach) { //영어->한글 한글->영어 로 배열 인덱스 변환 j = (j == 0 ? 1 : 0); cout << strDictionaly[i][j] << endl; } else { //동일 단어 없을시 앞글자가 동일한 단어 출력 isSerach = false; for (i = 0; i <= cnt; i++) { for (j = 0; j < 2; j++) { if (strDictionaly[i][j].find(seachWord) == 0) { isSerach = true; cout << strDictionaly[i][j] << " "; } } } //그런 단어도 없을 경우 검색 실패 if (!isSerach) { cout << "검색 결과가 없습니다."; } cout << endl; } } } | cs |
출력 결과
[출처] (C++) Simple 한/영사전 예제|작성자 길가다주은노트북
(MFC) 메시지 처리 (0) | 2016.07.09 |
---|---|
(C++) 클래스와 객체 (0) | 2016.07.09 |
(C++) 상속을 이용한 간단한 계산 클래스 구현 (0) | 2016.07.09 |
(C++) 상속성 (0) | 2016.07.09 |
(C++) 연산자 오버로딩 (0) | 2016.07.09 |
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include<iostream> using namespace std; class Calc { protected: int a, b; char c; public: Calc(int new_a, int new_b,char new_c); void Prn(); }; void Calc::Prn() { cout << "a : "<< a << "\tb : " << b<<"\tc : " << c << endl; } Calc::Calc(int new_a, int new_b, char new_c) : a(new_a), b(new_b), c(new_c) { } class Add : public Calc { protected: int c; public: Add(int new_a, int new_b); void Sum(); void Prn(); }; void Add::Sum() { c = a + b; } Add::Add(int new_a, int new_b) : Calc(new_a, new_b,'+') ,c(0) { } void Add::Prn() { cout << a << " + " << b << " = " << c << endl; } class Sub : public Calc { protected: int c; public: Sub(int new_a, int new_b); void Sum(); void Prn(); }; void Sub::Sum() { c = a - b; } Sub::Sub(int new_a, int new_b) : Calc(new_a, new_b, '-'), c(0) { } void Sub::Prn() { cout << a << " - " << b << " = " << c << endl; } class Mul : public Calc { protected: int c; public: Mul(int new_a, int new_b); void Sum(); void Prn(); }; void Mul::Sum() { c = a * b; } Mul::Mul(int new_a, int new_b) : Calc(new_a, new_b, '*'), c(0) { } void Mul::Prn() { cout << a << " * " << b << " = " << c << endl; } class Div : public Calc { protected: double c; public: Div(int new_a, int new_b); void Sum(); void Prn(); }; void Div::Sum() { c = (double)a / b; } Div::Div(int new_a, int new_b) : Calc(new_a, new_b, '/'), c(0) { } void Div::Prn() { cout << a << " / " << b << " = " << c << endl; } void main() { Calc x(3, 5, '-'); x.Prn(); Add y(3, 5); y.Sum(); y.Prn(); Sub z(3, 5); z.Sum(); z.Prn(); Mul a(3, 5); a.Sum(); a.Prn(); Div b(3, 5); b.Sum(); b.Prn(); } | cs |
[출처] (C++) 상속을 이용한 간단한 계산 클래스 구현|작성자 길가다주은노트북
(C++) 클래스와 객체 (0) | 2016.07.09 |
---|---|
(C++) Simple 한/영사전 예제 (0) | 2016.07.09 |
(C++) 상속성 (0) | 2016.07.09 |
(C++) 연산자 오버로딩 (0) | 2016.07.09 |
(C++) 클래스 객체 (0) | 2016.07.09 |
상속
부모 클래스를 물려받아 자식클래스가 그대로 사용할 수 있는 것
이미 정의된 클래스를 상속받아 사용 할 수 있는 장점
부모가 되는 클래스 : 기반 클래스, 기초 클래스, 베이스 클래스
자식 클래스 : 파생 클래스
접근 지정자 | 자신의 클래스 | 파생 클래스 | 클래스 외부 |
private | O | X | X |
protected | O | O | X |
public | O | O | O |
파생 클래스 사용 방법
class 파생 클래스 : 접근 지정자 기반 클래스{
멤버변수:
멤버함수:
};
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include<iostream> using namespace std; class Calc { protected: int a, b, c; public: void Init(int new_a, int new_b); void Prn(); }; void Calc::Init(int new_a, int new_b) { a = new_a; b = new_b; c = 0; } void Calc::Prn() { cout << "a : "<< a << "\tb : " << b << "\tc : " << c << endl; } class Add : public Calc { public: void Sum(); }; void Add::Sum() { c = a + b; } class Mul : public Calc { public: void Gob(); }; void Mul::Gob() { c = a*b; } void main() { Add x; Mul y; x.Init(3, 5); y.Init(2, 7); x.Sum(); x.Prn(); y.Gob(); y.Prn(); } | cs |
▲부모 클래스와 파생 클래스 생성 예제
상속관계에서의 생성자와 소멸자
생성자와 소멸자는 맴버함수지만 상속이 불가능
파생 객체가 생성시 부모 클래스의 생성자 까지 연속적으로 자동 호출됨
즉, 위 예제의 Add 클래스를 생성할때 Calc 생성자도 호출되며 메모리 공간엔 Calc+Add 만큼 공간을 차지하게 됨
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 31 | #include<iostream> using namespace std; class Base { public: Base(); ~Base(); }; Base::Base() { cout << "부모 클래스의 생성자 호출" << endl; } Base::~Base() { cout << "부모 클래스의 소멸자 호출" << endl; } class Dervied : public Base{ public: Dervied(); ~Dervied(); }; Dervied::Dervied() { cout << "파생 클래스의 생성자 호출" << endl; } Dervied::~Dervied() { cout << "파생 클래스의 생성자 호출" << endl; } void main() { Dervied obj; } | cs |
▲상속관계에서의 생성자와 소멸자
부모 클래스의 생성자가 인자값이 필요한 경우 다음과 같이 전달할 수 있다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<iostream> using namespace std; class Calc { protected: int a, b, c; public: Calc(); Calc(int new_a, int new_b); void Prn(); }; void Calc::Prn() { cout << "a : "<< a << "\tb : " << b << "\tc : " << c << endl; } Calc::Calc() { a = 0; b = 0; c = 0; } Calc::Calc(int new_a, int new_b) : a(new_a), b(new_b), c(0) { } class Add : public Calc { public: void Sum(); Add(int new_a, int new_b); Add(); }; void Add::Sum() { c = a + b; } Add::Add(int new_a, int new_b) : Calc(new_a, new_b) { } Add::Add() : Calc() { } void main() { Calc x(3, 5); x.Prn(); Add y(3, 5); y.Prn(); Add z; z.Prn(); } | cs |
▲상속 관계에서 생성자 문제 해결하기
오버라이딩
이미 정의된 함수를 파생클래스에서 다시 정의하는 것(재정의)
부모 클래스에서 정의된 함수의 원형과 동일한 형태여야 함
오버로딩 : 같은 함수이름을 매개변수와 반환타입을 다르게하여 여러개 정의하는 것
오버라이딩 : 상속받은 함수를 재정의 하는 것
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include<iostream> using namespace std; class Calc { protected: int a, b; public: Calc(); Calc(int new_a, int new_b); void Prn(); }; void Calc::Prn() { cout << "a : "<< a << "\tb : " << b << endl; } Calc::Calc() : a(0),b(0) { } Calc::Calc(int new_a, int new_b) : a(new_a), b(new_b) { } class Add : public Calc { protected: int c; public: Add(int new_a, int new_b); Add(); void Sum(); void Prn(); }; void Add::Sum() { c = a + b; } Add::Add(int new_a, int new_b) : Calc(new_a, new_b) ,c(0) { } Add::Add() : Calc(), c(0) { } void Add::Prn() { cout << a << " + " << b << " = " << c << endl; } class Mul : public Calc { protected: int c; public: Mul(int new_a, int new_b); Mul(); void Gob(); void Prn(); }; void Mul::Gob() { c = a * b; } Mul::Mul(int new_a, int new_b) : Calc(new_a, new_b), c(0) { } Mul::Mul() : Calc(), c(0) { } void Mul::Prn() { cout << a << " * " << b << " = " << c << endl; } void main() { Calc x(3, 5); x.Prn(); Add y(3, 5); y.Sum(); y.Prn(); Mul z(3, 5); z.Gob(); z.Prn(); } | cs |
▲오버라이딩 예제
(C++) Simple 한/영사전 예제 (0) | 2016.07.09 |
---|---|
(C++) 상속을 이용한 간단한 계산 클래스 구현 (0) | 2016.07.09 |
(C++) 연산자 오버로딩 (0) | 2016.07.09 |
(C++) 클래스 객체 (0) | 2016.07.09 |
(C++, MFC) 영상처리 16*16블록으로 DCT(discrete cosine transform)&역DCT (0) | 2016.07.09 |
객체를 다루기 위한 함수
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 31 32 33 34 35 36 37 38 | #include<iostream> using namespace std; class Complex { private: int real; int image; public: Complex(int r = 0, int i = 0); void showComplex(); Complex sum(Complex rightHand); }; void Complex::showComplex() { cout << "( " << real << " + " << image << "i )" << endl; } Complex::Complex(int r, int i) { real = r; image = i; } Complex Complex::sum(Complex rightHand) { Complex res; res.real = this->real + rightHand.real; res.image = this->image + rightHand.image; return res; } void main() { Complex x(10, 20), y(20, 40); Complex z; z = x.sum(y); x.showComplex(); y.showComplex(); z.showComplex(); } | cs |
▲두 객체의 합을 클래스로 반환하는 메소드를 사용한 예
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 31 32 33 34 35 36 37 38 | #include<iostream> using namespace std; class Complex { private: int real; int image; public: Complex(int r = 0, int i = 0); void showComplex(); friend Complex sum(Complex leftHand, Complex rightHand); }; void Complex::showComplex() { cout << "( " << real << " + " << image << "i )" << endl; } Complex::Complex(int r, int i) { real = r; image = i; } Complex sum(Complex leftHand, Complex rightHand) { Complex res; res.real = leftHand.real + rightHand.real; res.image = leftHand.image + rightHand.image; return res; } void main() { Complex x(10, 20), y(20, 40); Complex z; z = sum(x, y); x.showComplex(); y.showComplex(); z.showComplex(); } | cs |
▲프렌드 함수로 두 객체의 합을 구하는 메소드 예
friend : 클래스에 private된 멤버변수를 외부함수에서 사용할 수 있도록 하는 키워드
데이터 보안에 문제가 있으므로 남발하면 안됨
클래스에서 선행처리, 후행처리 하는 방법
real의 값을 1 더하는 행동
++this->real -> 선행처리
this->real++ -> 후행처리
복사된 값을 넘겨주느냐 더한값을 넘겨주느냐에 따라 선행과 후행이 결정됨
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include<iostream> using namespace std; class Complex { private: int real; int image; public: Complex(int r = 0, int i = 0); void showComplex(); Complex addOnePreFix(); Complex addOnePostFix(); }; void Complex::showComplex() { cout << "( " << real << " + " << image << "i )" << endl; } Complex::Complex(int r, int i) { real = r; image = i; } //선행처리 Complex Complex::addOnePreFix() { ++this->real; ++this->image; return *this; } //후행처리 Complex Complex::addOnePostFix() { Complex temp; temp = *this; ++this->real; ++this->image; return temp; } void main() { Complex x(10, 20), y(20, 40); Complex z; cout << "---- 선행처리 ----"<<endl; z = x.addOnePreFix(); x.showComplex(); z.showComplex(); cout << "---- 후행처리 ----" << endl; z = y.addOnePreFix(); y.showComplex(); z.showComplex(); } | cs |
출력결과
프렌드 함수를 이용한 구현
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include<iostream> using namespace std; class Complex { private: int real; int image; public: Complex(int r = 0, int i = 0); void showComplex(); friend Complex &addOnePreFix(Complex &Operand); friend Complex addOnePostFix(Complex &Operand); }; void Complex::showComplex() { cout << "( " << real << " + " << image << "i )" << endl; } Complex::Complex(int r, int i) { real = r; image = i; } //선행처리 Complex &addOnePreFix(Complex &Operand) { ++Operand.real; ++Operand.image; return Operand; } //후행처리 Complex addOnePostFix(Complex &Operand) { Complex temp; temp = Operand; ++Operand.real; ++Operand.image; return temp; } void main() { Complex x(10, 20), y(20, 40); Complex z; cout << "---- 선행처리 ----" << endl; z = addOnePreFix(x); x.showComplex(); z.showComplex(); cout << "---- 후행처리 ----" << endl; z = addOnePostFix(y); y.showComplex(); z.showComplex(); } | cs |
연산자 오버로딩
C++에서 기본 자료형으로 사용하고 있는 연산자를 재정의 하는 것
연산자도 함수로 취급하기 때문에 함수를 정의하는 방법과 동일 한 방법으로 연산자를 오버로딩할 수 있음
오버로딩 된 연산자를 연산자함수(Operator Function)이라고 함
연산에 참여하는 피연산자는 연산자를 정의할 때 매개변수로 구현하여 사용
매개변수 자료형에 의해 그 연산자를 사용할 수 있는 자료형이 결정됨
반환값 operator연산자(매개변수1,매개변수2,...)
{
함수의 본체
}
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include<iostream> using namespace std; class Complex { private: int real; int image; public: Complex(int r = 0, int i = 0); void showComplex(); Complex operator+(Complex rightHand); Complex operator-(const Complex &rightHand) const; Complex operator-() const; }; void Complex::showComplex() { if (image > 0) cout << "(" << real << "+" << image << " i)" << endl; else if (image < 0) cout << "(" << real << image << " i)" << endl; else cout << real << endl; } Complex::Complex(int r, int i) { real = r; image = i; } //연산자 +를 오버로딩 Complex Complex::operator+(Complex rightHand) { Complex res; res.real = this->real + rightHand.real; res.image = this->image + rightHand.image; return res; } //연산자 -를 오버로딩 Complex Complex::operator-(const Complex &rightHand) const{ Complex res; res.real = this->real - rightHand.real; res.image = this->image - rightHand.image; return res; } //부호 변경 Complex Complex::operator-() const { Complex res; res.real = -real; res.image = -image; return res; } void main() { Complex x(10, 20), y(20, 40); Complex z; cout << "---- 두 Complex 객체에 대한 덧셈 ----" << endl; z = x + y; x.showComplex(); y.showComplex(); z.showComplex(); cout << "---- 두 Complex 객체에 대한 뺄셈 ----" << endl; z = x - y; x.showComplex(); y.showComplex(); z.showComplex(); cout << "---- Complex 객체의 부호 변경 ----" << endl; z = -x; x.showComplex(); z.showComplex(); } | cs |
출력결과
cout에서 출력할 때 사용하는 << 연산자도 연산자오버로딩이 가능함.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<iostream> using namespace std; class Complex { private: int real; int image; public: Complex(int r = 0, int i = 0); friend ostream &operator<<(ostream &os, const Complex &comObj); }; Complex::Complex(int r, int i) { real = r; image = i; } ostream &operator<<(ostream &os, const Complex &comObj) { os << "( " << comObj.real << " + " << comObj.image << "i )" << endl; return os; } void main() { Complex x(10, 20); cout << x; } | cs |
출력결과
[출처] (C++) 연산자 오버로딩|작성자 길가다주은노트북
(C++) Simple 한/영사전 예제 (0) | 2016.07.09 |
---|---|
(C++) 상속을 이용한 간단한 계산 클래스 구현 (0) | 2016.07.09 |
(C++) 상속성 (0) | 2016.07.09 |
(C++) 클래스 객체 (0) | 2016.07.09 |
(C++, MFC) 영상처리 16*16블록으로 DCT(discrete cosine transform)&역DCT (0) | 2016.07.09 |