>백엔드 개발 >C#.Net 튜토리얼 >C++에서 연산자 오버로딩 방법은 무엇입니까?

C++에서 연산자 오버로딩 방법은 무엇입니까?

hzc
hzc원래의
2020-06-18 11:47:365062검색

C++에서 연산자 오버로딩 방법은 무엇입니까?

C++에서 연산자를 오버로드하는 방법은 무엇인가요?

연산자를 오버로드하는 방법에는 두 가지가 있습니다.
1. 오버로드된 연산자를 클래스의 멤버 함수로 만듭니다. 이를 통해 연산자 함수는 클래스의 전용 멤버에 액세스할 수 있습니다. 또한 함수가 암시적인 this 포인터 매개변수를 사용하여 호출 개체에 액세스할 수 있습니다.

2. 오버로드된 멤버 함수를 독립적이고 별도의 함수로 만듭니다. 이런 방식으로 오버로드된 경우 연산자 함수는 클래스의 전용 멤버에 액세스하기 위해 클래스의 friend로 선언되어야 합니다.
일부 연산자(예: 스트림 입력 연산자 >> 및 스트림 출력 연산자 <<)는 독립 함수로 오버로드되어야 합니다. 다른 연산자는 멤버 함수 또는 독립 실행형 함수로 오버로드될 수 있습니다.
다음과 같은 독립적인 오버로드된 함수 코드를 작성했다고 가정합니다.

Length a(4, 2), b(1, 8), c (0);
c = a + b;

이 코드는 컴파일러에 의해 다음 형식으로 해석됩니다.

Length a(4, 2), b(1, 8), c(0);
c = operator+(a, b);

컴파일러를 사용하면 프로그래머가 친숙한 중간 캐럿을 사용할 수 있습니다. 그러나 연산자를 이름이 연산자+인 일반 함수로 취급하는데 이는 그다지 명확하지 않은 의미를 갖습니다. 예를 들어, 다음 문을 고려해 보세요.

c = 2 + a;

는 다음 문과 동일합니다.

c = operator+(2, b);

두 문 모두 올바르게 컴파일되고 실행됩니다. 왜냐하면 Length 클래스의 변환 생성자가 정수 매개 변수 2에서 Length 개체를 생성할 수 있기 때문입니다. .

산술 및 관계 연산자의 오버로드는 멤버 함수의 오버로드만큼 쉬울 수 있습니다. 덧셈 연산자의 오버로딩 방법은 다음과 같습니다. 먼저, 연산자를 멤버 함수로 만들기 위해 클래스 내 선언을 수정합니다.

class Length
{
    private:
        int len_inches;
    public:
        //修改operator+的声明
        Length operator+(Length b);
        //类的其余部分,省略
};

이제 연산자는 멤버 함수로서 연산자가 자동으로 Length 유형으로 전달되기 때문에 길이 유형의 단일 연산자로 선언됩니다. 암시적 매개변수 this를 통해 객체를 생성합니다. 예를 들어,

Length a(4, 2), b(1, 8), c(0);
c = a + b;

문을 작성하면 컴파일러는 이 문을 다음 형식으로 처리합니다.

Length a(4, 2), b(1, 8), c (0);
c = a.operator+ (b);

a + b를 작성할 때 오버로드된 + 연산자의 왼쪽 피연산자가 호출 멤버가 됩니다. 객체 함수의 오른쪽 피연산자는 명시적 매개변수가 됩니다. 이러한 변경 사항과 함께 연산자 본문은 다음 형식의 명령문으로 작성되었습니다.

Length Length::operator+(Length b)
{
    return Length(this->len_inches + b.len_inches);
}

요약하자면 덧셈 연산자(기타 산술 및 관계 연산자 포함)는 멤버 함수와 마찬가지로 사용할 수 있습니다. 독립형 함수 오버로드.
일반적으로 이항 연산자를 동일한 유형의 형식 매개변수를 사용하는 독립 함수로 오버로드하는 것이 좋습니다. 이는 독립 실행형 연산자의 오버로드와 달리 멤버 함수의 오버로드가 왼쪽 매개 변수를 암시적으로 만들어 두 매개 변수 간에 인위적인 구별을 만들어 변환 생성자가 오른쪽 매개 변수를 적용할 수 있게 하지만 왼쪽 매개 변수는 그렇지 않기 때문입니다. 사용되어 형식 매개변수의 순서가 변경되는 상황이 발생하고, 변경되면 올바른 프로그램에서 컴파일러 오류가 발생합니다. 예는 다음과 같습니다:

Length a(4, 2), c(0);
c = a + 2; //编译,当于 c = a.operator+ (2)
c = 2 + a; //不能编译:相当于 c = 2 .operator+ (a);

추천 튜토리얼: "c++"

위 내용은 C++에서 연산자 오버로딩 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.