C++ 오버로드된 연산자 및 오버로드된 함수
C++에서는 동일한 범위의 특정 함수 및 연산자에 대해 여러 정의를 지정할 수 있습니다. 이를 각각 함수 오버로딩 및 연산자 오버로딩이라고 합니다.
오버로드된 선언이란 이전에 이 범위에 선언된 함수나 메서드와 이름은 동일하지만 매개변수 목록과 정의(구현)가 다른 선언을 말합니다.
오버로드된 함수 또는 오버로드된 연산자를 호출하면 컴파일러는 사용하는 매개변수 유형과 정의의 매개변수 유형을 비교하여 가장 적절한 정의를 사용하기로 결정합니다. 가장 적절한 오버로드 함수나 연산자를 선택하는 과정을 오버로드 결정이라고 합니다.
C++의 함수 오버로딩
동일한 범위에서 유사한 함수로 동일한 이름의 여러 함수를 선언할 수 있지만, 동일한 이름을 가진 이러한 함수의 형식 매개변수(매개변수의 수, 유형 또는 순서 참조)는 반드시 달라져라. 단순히 반환 유형을 다르게 해서 함수를 오버로드할 수는 없습니다.
다음 예에서는 같은 이름의 함수 print()를 사용하여 다양한 데이터 유형을 출력합니다.
#include <iostream> using namespace std; class printData { public: void print(int i) { cout << "Printing int: " << i << endl; } void print(double f) { cout << "Printing float: " << f << endl; } void print(char* c) { cout << "Printing character: " << c << endl; } }; int main(void) { printData pd; // Call print to print integer pd.print(5); // Call print to print float pd.print(500.263); // Call print to print character pd.print("Hello C++"); return 0; }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Printing int: 5 Printing float: 500.263 Printing character: Hello C++
연산자 오버로딩 C++에서
대부분의 C++ 내장 연산자를 재정의하거나 오버로드할 수 있습니다. 이를 통해 사용자 정의 유형의 연산자를 사용할 수 있습니다.
오버로드된 연산자는 특수한 이름을 가진 함수입니다. 함수 이름은 키워드 연산자와 오버로드할 연산자 기호로 구성됩니다. 다른 함수와 마찬가지로 오버로드된 연산자에는 반환 유형과 매개변수 목록이 있습니다.
Box operator+(const Box&);
두 개의 Box 객체를 추가하고 최종 Box 객체를 반환하는 데 더하기 연산자가 사용된다고 선언합니다. 대부분의 오버로드된 연산자는 일반 비멤버 함수 또는 클래스 멤버 함수로 정의될 수 있습니다. 위 함수를 클래스의 비멤버 함수로 정의하는 경우 아래와 같이 각 작업에 대해 두 개의 매개 변수를 전달해야 합니다.
Box operator+(const Box&, const Box&);
다음 예에서는 멤버 함수를 사용한 연산자 오버로드의 개념을 보여줍니다. 여기서 객체는 매개변수로 전달되고 객체의 속성은 아래와 같이 this 연산자를 사용하여 액세스됩니다.
#include <iostream> using namespace std; class Box { public: double getVolume(void) { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } // 重载 + 运算符,用于把两个 Box 对象相加 Box operator+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // 长度 double breadth; // 宽度 double height; // 高度 }; // 程序的主函数 int main( ) { Box Box1; // 声明 Box1,类型为 Box Box Box2; // 声明 Box2,类型为 Box Box Box3; // 声明 Box3,类型为 Box double volume = 0.0; // 把体积存储在该变量中 // Box1 详述 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2 详述 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // Box1 的体积 volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // Box2 的体积 volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // 把两个对象相加,得到 Box3 Box3 = Box1 + Box2; // Box3 的体积 volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return 0; }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Volume of Box1 : 210 Volume of Box2 : 1560 Volume of Box3 : 5400
오버로드 가능 연산자 /오버로드 불가능한 연산자
오버로드 가능한 연산자 목록은 다음과 같습니다.
+ | - | * | / | % | ^ | |||||||||||||||
& | | | ~ | ! | , | = | |||||||||||||||
< | > | <= | >= | ++ | -- | |||||||||||||||
<< | > ;> | | = | *= | <<= | >>= | |||||||||||||||
() | -> | -> | 삭제삭제 [] | |||||||||||||||||
다음은 오버로드할 수 없는 연산자 목록입니다. | :: | .* | . | ?: | ||||||||||||||||
주문 | 연산자 및 인스턴스 |
---|---|
1 | 단항 연산자 오버로드 |
2 | 이진 연산자 오버로드 |
3 | 관계 연산자 오버로딩 |
4 | 입력/ 출력 연산자 오버로딩 |
5 | ++ 및 -- 연산자 오버로딩 |
6 | 대입 연산자 오버로딩 |
7 | 함수 호출 연산자() 오버로딩 |
8 | 아래첨자 연산자[ ] 오버로드 |
9 | 클래스 멤버 액세스 연산자-> 오버로드 |