20111216
Programming/C, C++ 2011. 12. 16. 17:31 |함수 오버로딩
동일한 이름의 함수를 중복해서 정의하는 것으로 함수의 구분은 매개변수의 개수나 타입으로 짓는다.
디폴트 매개 변수
전달되지 않은 인자를 대신하기 위한 기본 값이 설정되어 있는 변수
int func(int a=10){
return a+1;
}
레퍼런스(Reference)
이름을 지니고 있는 대상에 별명을 붙여주는 것
int &ref = val;
ref로 처리하나 val로 처리하나 같은 결과를 보여준다.
- 이름이 존재하지 않는 대상을 레퍼런스 할 수 없고, 선언과 동시에 초기화되어야 함.
int &ref1; // 초기화되지 않음
int &ref2 = 10; // 상수는 올 수 없음(이름을 지니고 있지 ㅇ낳음)
연산자 오버로딩
클래스의 성격에 따라 필요한 연산 기능이 있다면 그에 맞게 동작하도록 기본연산자의 기능을 재정의하는 것.
->객체의 데이터멤버를 처리하는 방법을 함수로 만들고 특정 연산자(+,- 등)를 사용하면 해당 함수가 자동으로 호출하도록 구현함.
연산자를 오버로딩 할 수 있다는 것은 C++의 큰 특징이며 클래스가 타입임을 보여주는 단적인 예이다.
기본형의 연산자(+)를 예를 들어,
정수+정수=정수
실수+실수=실수
같이 다른 타입들이 잘 작동하게 할 수 있는 원인은
int +(int, int)
double +(double, double)
아마 이러한 형태로 오버로딩되어 있을 것이고,
정수덧셈과 실수덧셈 각각의 알고리즘에 맞게 굴러가도록 되어있을 것이다.
클래스도 타입이니 이와같은 연산이 가능하다고 생각할 진 모르나
실제로 classA + classB 를 했을 때 컴파일러는 두 객체를 어떻게 더해야 되는지 방법을 전혀 알 수가 없다.
그래서 개발자가 연산자 오버로딩을 이용하여 각 개체들끼리 어떻게 더해야 잘 더했다고 소문이 나는지 알려줄 수 있다.
① 멤버연산자함수
class Time
{
private:
int hour, min, sec;
public:
...
const Time operator +(const Time &T) const {
...
}
};
void main() {
Time A(1,1,1);
Time B(2,2,2);
Time C;
...
C = A + B; // C = A.operator +(B)
...
}
② 전역연산자함수
(주요코드는 위랑 비스무리함)
class Time{
friend const Time operator+ (const Time &T1, const Time &T2);
...
const Time operator+ (const Time &T1, const Time &T2)
{
Time R
R.sec = T1.sec + T2.sec;
...
void main() {
...
C = A + B; // C = operator +(A, B)
...
}
멤버연산자함수 : 원래의 피연산자보다 인수의 개수가 항상 하나 더 적음.
원래 +는 이항 연산자이므로 두 개의 피연산자를 취하지만,
멤버 연산자 함수의 인수는 이 함수를 호출하는 객체인 *this가 암시적인 좌변이 되며
나머지 우변이 될 대상만 인수로 전달받기 때문에 하나만 있으면 됨.
만약 += 단항 연산자를 멤버 연산자 함수로 오버로딩한다면 호출하는 객체 자체가 피연산자가 되므로 인수는 필요없음.
전역연산자함수 : 원래의 피연산자와 같은 수의 인수를 가짐.
+ 연산자가 이항 연산자이므로 operator + 전역 연산자 함수는 두 개의 인수를 취하고
++ 연산자는 단항 연산자이므로 operator ++ 전역 연산자 함수는 증가시킬 대상 하나만 인수로 전달받으면 됨
암시적으로 전달되는 this가 없으므로 좌우변 모두 인수로 전달받아야 함
참고
http://www.winapi.co.kr/
'Programming > C, C++' 카테고리의 다른 글
20120109_복사생성자, const (0) | 2012.01.09 |
---|---|
20111219_상속 (0) | 2011.12.19 |
20111215_구조체, 상속성 (0) | 2011.12.15 |
20111212_C 기초부터 정리하긔 (0) | 2011.12.12 |
20111212_정적멤버변수/함수, 상수멤버 (0) | 2011.12.12 |