오버로딩 Vs 오버라이딩 ( Overloading Vs Overriding )




1.오버로딩 


함수의 이름은 같지만, '반환형 / 매개변수 - (매개변수의 수, 순서, 타입)'가 다른 것.


컴파일러는 함수의 구분할 때 함수의 서명(=signature)를 통해 관리를 한다. 

기본적으로 함수의 함수의 이름이 다르거나,

함수의 이름은 같지만, 매개변수의 리스트가 다르다면 signature자체를 따로 관리를 한다


Overloaded functions must have different signatures. 


# 시그니처가 포함하는 것

 1) 함수의 이름

 2) 파라메터의 순서와 개수, 타입



# 시그니처가 포함하는 것

 1) 리턴형 타입

 2) const 여부

 3) call by reference &  - 인자가 &로 전달되어도 같은 함수로 생각함




2. 오버라이딩


완전히 동일하다. 즉, 함수의 이름도, 함수의 반환형도, 매개변수도 동일하다.


다만 내용이 재정의(re-definition)가 되어있다.

 



'C++' 카테고리의 다른 글

증감연산자 오버로딩  (0) 2018.02.18
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩  (0) 2018.02.18
파일스트림 입출력  (0) 2018.02.17
배열  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16

증감연산자 오버로딩


증감 연산자 ++, -- 의 경우, 특수한 케이스이다.


1) prefix

2) postfix 


두가지로 나누어 처리하는데, 다음의 msdn 문서를 참고하면 좋다. main 함수 부분은 내가 추가했다.


// increment_and_decrement1.cpp class Point { public: // Declare prefix and postfix increment operators. Point& operator++(); // Prefix increment operator. Point operator++(int); // Postfix increment operator. // Declare prefix and postfix decrement operators. Point& operator--(); // Prefix decrement operator. Point operator--(int); // Postfix decrement operator. // Define default constructor. Point() { _x = _y = 0; } // Define accessor functions. int x() { return _x; } int y() { return _y; } private: int _x, _y; }; // Define prefix increment operator. Point& Point::operator++() { _x++; _y++; return *this; } // Define postfix increment operator. Point Point::operator++(int) { Point temp = *this; ++*this; return temp; } // Define prefix decrement operator. Point& Point::operator--() { _x--; _y--; return *this; } // Define postfix decrement operator. Point Point::operator--(int) { Point temp = *this; --*this; return temp; } int main() {      

Point p1, p2; p1++;

++p2;

}



문득, 나는 어떻게 컴파일러가 prefix와 postfix 의 호출을 구분하는지 너무 궁금했다... 특수한 케이스라고만 적혀있어서 답답했는데

다음을 읽으면서 의문이 확풀렸다.



I don't think we're understanding your question, because the answer seems plainly obvious.

In the case of primitives it is clear the ++ before the primitive is treated as prefix and after the primitive is treated as postfix

It is exactly the same for objects.

But this is a user defined object.

That doesn't matter. If the ++ is before the object name, it uses prefix. If it's after, it uses postfix.

How does compiler brand one as "prefix" and other as "postfix"?


The C++ standard says that if it has a dummy int parameter, it's a postfix operator. If no dummy int parameter, then it's the prefix operator.


 결국, 컴파일러는 객체 전과 후로 prefix / postfix를 구분하고, 더미의 유무로 함수를 찾아갈 뿐 호출상으로 int 값을 나도 모르게 넘긴다던가.. 그런 일은 없었다...

'C++' 카테고리의 다른 글

오버로딩 Vs 오버라이딩  (0) 2018.02.19
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩  (0) 2018.02.18
파일스트림 입출력  (0) 2018.02.17
배열  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16


'<< 오퍼레이터, >> 오퍼레이터' 오버로딩


<< 연산자의 이름이 double shift라고 막연히 생각했는데, insertion operator 라는 충격적인 사실을 알게 되었다. 마찬가지로 >> 도 extraction operator라는 이름을 가지고 있었다. 


# C++의 표준 입출력 스트림 객체와 함께 사용되는 연산자  >> , <<

1) >> operator :  extraction operator

2) << operator :  insertion operator 


이를 위해, msdn 의 차료를 참고해서 공부를 해보자.



1. >> operator  오버로딩(Input stream - extraction operator)


Input streams use the extraction (>>) operator for the standard types. You can write similar extraction operators for your own types; your success depends on using white space precisely.

Here is an example of an extraction operator for the Date class presented earlier:

istream& operator>> ( istream& is, Date& dt )  
{  
   is >> dt.mo >> dt.da >> dt.yr;  
   return is;  
}  


이 경우에는 return by address를 통해서 istream 객체를 반환하여 chaining을 지원하여 1) is >> dt.mo, 2) is > >dt.da , 3) is >> dt.yr 순으로 실행된다.




2. << operator  오버로딩


Output streams use the insertion (<<) operator for standard types. You can also overload the << operator for your own classes.

The write function example showed the use of a Date structure. A date is an ideal candidate for a C++ class in which the data members (month, day, and year) are hidden from view. An output stream is the logical destination for displaying such a structure. This code displays a date using the cout object:

Date dt( 1, 2, 92 );  
cout << dt;  

To get cout to accept a Date object after the insertion operator, overload the insertion operator to recognize an ostream object on the left and a Date on the right. The overloaded << operator function must then be declared as a friend of class Date so it can access the private data within a Date object.

// overload_date.cpp // compile with: /EHsc #include <iostream> using namespace std; class Date { int mo, da, yr; public: Date(int m, int d, int y) { mo = m; da = d; yr = y; } friend ostream& operator<<(ostream& os, const Date& dt); // friend 키워드를 통해 directly access data 가능 }; ostream& operator<<(ostream& os, const Date& dt) // 오퍼레이터 오버로딩 { os << dt.mo << '/' << dt.da << '/' << dt.yr; // 예를 들면 5/6/92 와 같이 출력 return os; } int main() { Date dt(5, 6, 92); cout << dt; }

5/6/92

The overloaded operator returns a reference to the original ostream object, which means you can combine insertions:

cout << "The date is" << dt << flush;  


https://msdn.microsoft.com/ko-kr/library/1z2f6c2k.aspx

'C++' 카테고리의 다른 글

오버로딩 Vs 오버라이딩  (0) 2018.02.19
증감연산자 오버로딩  (0) 2018.02.18
파일스트림 입출력  (0) 2018.02.17
배열  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16

+ Recent posts