C Quack의 연산자 오버로드 기본 자습서 및 규칙 준수 [기사 끝에 세 권의 책]

블로거 이름: Ah Yue's Xiaodongdong

함께 발전합시다!

목차

기본 사상

우선 순위 및 연관성

용도를 변경하지 않습니다

전역적으로 연산자 오버로딩

요약

이번 호 도서 배송 : 1년 동안 기다려온 Core Java Volume II 최신 버전이 드디어 출시되었습니다.


기본 사상

연산자 오버로딩은 개념적으로 누구나 쉽게 이해할 수 있는 함수 오버로딩을 통해 이루어지는데, 이 절에서는 연산자 오버로딩에 대한 주의사항에 대해 알아보겠습니다.

1) 모든 연산자가 오버로드될 수 있는 것은 아닙니다. 오버로드할 수 있는 연산자는 다음과 같습니다.
+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> <<= >>= == ! = <= >= && || ++ -- , ->* -> () [] new new[] delete delete[]

위의 연산자 중 첨자 연산자와 함수 호출 연산자 []입니다 . ()사전 증가 및 사후 감소 연산자는 모두 오버로드될 수 있습니다. 길이 연산자 sizeof, 조건부 연산자 : ?, 멤버 선택기 .및 필드 확인 연산자는 ::오버로드할 수 없습니다.

우선 순위 및 연관성



2) 오버로딩은 연산자의 우선 순위와 연관성을 변경할 수 없습니다. +이전 섹션의 복합 클래스에서 부호와 부호가 오버로드되고 c1, c2, c3 및 c4가 모두 복합 클래스의 객체라고 가정하면 *다음 명령문이 있습니다.

c4 = c1 + c2 * c3;

다음과 같음:

c4 = c1 + ( c2 * c3 );

곱셈은 ​​여전히 ​​덧셈보다 우선 순위가 높으며 여전히 이항 연산자입니다.

용도를 변경하지 않습니다



3) 오버로드는 연산자의 사용법, 피연산자의 원래 수, 피연산자가 왼쪽에 있든 오른쪽에 있든 변경되지 않습니다. 예를 들어, ~숫자 오른쪽에는 피연산자가 하나만 있고 +숫자는 항상 두 피연산자 사이에 나타나며 오버로드 후 같아야 합니다.

4) 연산자 오버로딩 함수는 기본 매개변수를 가질 수 없습니다. 그렇지 않으면 연산자 피연산자의 수가 변경되며 이는 분명히 잘못된 것입니다.

5) 연산자 오버로딩 함수는 클래스의 멤버 함수 뿐만 아니라 전역 함수로도 사용할 수 있습니다.

연산자 오버로딩 함수가 클래스의 멤버 함수로 사용되는 경우 이진 연산자는 매개 변수가 하나만 있고 단항 연산자는 매개 변수가 필요하지 않습니다. 매개변수가 하나 적은 이유는 이 매개변수가 내포되어 있기 때문입니다.

예를 들어 더하기 연산자는 이전 섹션의 복합 클래스에서 오버로드됩니다.

복소수 연산자+(const complex & A) const;

실행할 때:

c3 = c1 + c2;

다음으로 변환됩니다.

c3 = c1.연산자+(c2);

이 포인터를 통해 암시적으로 c1의 멤버 변수에 액세스합니다.

연산자 오버로딩 함수를 전역 함수로 사용하는 경우 이항 연산자는 두 개의 매개변수가 필요하고 단항 연산자는 하나의 매개변수가 필요하며 매개변수 중 하나는 객체여야 컴파일러에서 이것이 프로그래머가 정의한 것임을 구분할 수 있습니다. 연산자 프로그래머가 내장 유형에 사용되는 연산자의 특성을 수정하지 못하도록 합니다.

예를 들어 다음은 올바르지 않습니다.

 
 
  1. int 연산자 + (int a,int b){
  2. 반환 (ab);
  3. }

+원래의 숫자는 두 개의 숫자를 더하는 것인데, 지금은 오버로딩을 통해 두 개의 숫자를 빼도록 기능을 변경하려고 합니다 4+3. 분명히 이것은 절대적으로 금지되어 있습니다.

매개변수가 두 개인 경우 두 매개변수 모두 개체이거나 하나는 개체이고 다른 하나는 기본 제공 C++ 유형의 데이터일 수 있습니다. 예를 들면 다음과 같습니다.

 
 
  1. 복합 연산자+(int a, 복합 &c){
  2. return complex(a+c.real, c.imag);
  3. }

이것이 하는 일은 정수와 복소수를 더하는 것입니다.

또한 연산자 오버로딩된 함수를 전역 함수로 사용하는 경우에는 일반적으로 해당 함수를 클래스에서 친구 함수로 선언해야 합니다. 이유는 간단합니다. 함수는 대부분의 경우 클래스의 전용 멤버를 사용해야 합니다.

이전 섹션의 마지막 예제에서 +전역 범위의 숫자를 오버로드하고 연산자 오버로드 함수를 복합 클래스의 친구 함수로 선언했습니다. 이 함수는 복합 클래스의 두 멤버 변수 m_real 및 m_imag를 사용하기 때문에 이들은 모두 비공개 속성이며 기본적으로 클래스 외부에서 액세스할 수 없습니다.

6) 화살표 연산자 ->, 첨자 연산자 [ ], 함수 호출 연산자 ( ), 대입 연산자는 =멤버 함수 형식으로만 오버로드할 수 있습니다.

소위 과부하는 새로운 의미를 부여하는 것입니다. 함수 오버로딩(Function Overloading)은 함수 이름에 여러 기능을 부여하고 상황에 따라 다른 작업을 수행할 수 있습니다. 연산자 오버로딩(Operator Overloading) 도 사실이며 동일한 연산자가 다른 기능을 가질 수 있습니다.

사실, 우리는 알지 못하는 사이에 이미 연산자 오버로딩을 사용하고 있습니다. 예를 들어, +number는 다른 유형(int, float 등)의 데이터에 대해 더하기 연산을 수행할 수 있으며, <<시프트 연산자일 뿐만 아니라 cout과 협력하여 데이터를 콘솔에 출력할 수도 있습니다. C++ 자체에서 이러한 연산자를 오버로드했습니다.

또한 C++는 프로그래머가 연산자 자체를 오버로드할 수 있도록 하여 매우 편리합니다.

다음 코드는 복소수 클래스를 정의합니다.연산자 오버로드를 통해 +복소수의 덧셈 연산을 숫자로 실현할 수 있습니다.

 
 
#include <iostream>
using namespace std;

class complex{
public:
complex();
complex(double real, double imag);
public:
//声明运算符重载
complex operator+(const complex &A) const;
void display() const;
private:
double m_real; //实部
double m_imag; //虚部
};

complex::complex(): m_real(0.0), m_imag(0.0){ }
complex::complex(double real, double imag): m_real(real), m_imag(imag){ }

//实现运算符重载
complex complex::operator+(const complex &A) const{
complex B;
B.m_real = this->m_real + A.m_real;
B.m_imag = this->m_imag + A.m_imag;
return B;
}

void complex::display() const{
cout<<m_real<<" + "<<m_imag<<"i"<<endl;
}

int main(){
complex c1(4.3, 5.8);
complex c2(2.4, 3.7);
complex c3;
c3 = c1 + c2;
c3.display();

return 0;
}

실행 결과:
6.7 + 9.5i

이 예에서 복합 클래스 complex가 정의되고 m_real은 실수 부분을 나타내고 m_imag는 허수 부분을 나타내며 10행은 연산자 오버로딩을 선언하고 21행은 구현(정의)합니다. 이 두 줄의 코드를 주의 깊게 관찰하면 연산자 오버로딩의 형식이 함수의 형식과 매우 유사하다는 것을 알 수 있습니다.

연산자 오버로딩은 실제로 함수를 정의하고 함수 본문에서 원하는 함수를 실현하는 것입니다.연산자를 사용하면 컴파일러가 자동으로 이 함수를 호출합니다. 즉, 연산자 오버로딩은 함수를 통해 이루어지며, 이는 본질적으로 함수 오버로딩입니다.

연산자 오버로딩의 형식은 다음과 같습니다.

반환 값 유형 연산자 연산자 이름(공식 매개변수 목록) {     //TODO: }

operator연산자를 오버로드하는 함수를 정의하는 데 특별히 사용되는 키워드입니다. operator 运算符名称 부분을 함수 이름으로 생각하면 되는데 , 위 코드의 경우 함수 이름은 operator+.

연산자 오버로딩 함수는 함수 이름이 특정 형식을 갖는다는 점을 제외하면 일반 함수와 다르지 않습니다.

위의 예에서 복합 클래스의 연산자를 오버로드했으며 +이 오버로드는 복합 객체에만 유효합니다. c3 = c1 + c2;명령문이 실행되면 컴파일러는 숫자 +의 왼쪽( +숫자가 왼쪽 결합성을 가지므로 왼쪽이 먼저 감지됨)이 복합 객체임을 감지하고 operator+()다음과 같은 형태로 변환되는 멤버 함수를 호출합니다. :

c3 = c1.연산자+(c2);

c1은 함수를 호출할 객체이고 c2는 함수의 실제 매개변수입니다.

위의 연산자 오버로딩은 보다 간결한 형식으로 정의할 수도 있습니다.

 
 
complex complex::operator+(const complex &A)const{
return complex(this->m_real + A.m_real, this->m_imag + A.m_imag);
}

return 문은 complex(this->m_real + A.m_real, this->m_imag + A.m_imag)이름이 없고 익명의 개체인 임시 개체를 만듭니다. 생성자는 임시 객체 생성 중에 호출되며 return 문은 임시 객체를 함수의 반환 값으로 사용합니다.

전역적으로 연산자 오버로딩

연산자 오버로딩 함수는 클래스의 멤버 함수뿐만 아니라 전역 함수로도 사용할 수 있습니다. 위의 코드를 변경하고 전역 범위에서 오버로드하여 +복소수의 추가 연산을 실현합니다.

 
 
#include <iostream>
using namespace std;

class complex{
public:
complex();
complex(double real, double imag);
public:
void display() const;
//声明为友元函数
friend complex operator+(const complex &A, const complex &B);
private:
double m_real;
double m_imag;
};

complex operator+(const complex &A, const complex &B);

complex::complex(): m_real(0.0), m_imag(0.0){ }
complex::complex(double real, double imag): m_real(real), m_imag(imag){ }
void complex::display() const{
cout<<m_real<<" + "<<m_imag<<"i"<<endl;
}

//在全局范围内重载+
complex operator+(const complex &A, const complex &B){
complex C;
C.m_real = A.m_real + B.m_real;
C.m_imag = A.m_imag + B.m_imag;
return C;
}

int main(){
complex c1(4.3, 5.8);
complex c2(2.4, 3.7);
complex c3;
c3 = c1 + c2;
c3.display();

return 0;
}

연산자 오버로딩 함수는 복합 클래스의 멤버 함수가 아니라 복합 클래스의 전용 멤버 변수를 사용하므로 복합 클래스에서 친구 함수로 함수를 선언해야 합니다. 명령문이 실행

되면 컴파일러는 숫자 양쪽에 복합 객체가 있음을 감지하고 이를 다음과 유사한 함수 호출로 변환합니다.c3 = c1 + c2;+

c3 = 연산자+(c1, c2);

요약

연산자 오버로딩으로 구현된 함수는 함수로 완전히 대체될 수 있지만 연산자 오버로딩은 프로그램 작성을 보다 인간적이고 읽기 쉽게 만듭니다. 연산자가 오버로드된 후에도 원래 함수는 여전히 유지되며 손실되거나 변경되지 않습니다. 연산자 오버로딩을 통해 C++에 있는 기존 연산자의 기능을 객체에 사용할 수 있도록 확장합니다.

이번 호 도서 배송 : 1년 동안 기다려온 Core Java Volume II 최신 버전이 드디어 출시되었습니다.

이 문제에 대한 책: 이 문제에 대한 세 권의 책: "Java Core Technology Volume II Advanced Features(원본의 12판")

얻는 방법:

고품질 댓글 + 좋아요를 받은 상위 2명에게는 각각 사본이 제공됩니다!

댓글란에서 랜덤으로 착한형제를 선택해서 책을 보내주세요!

추첨 시간: 5월 10일 오후 8시

28년 전 자바의 탄생 이후, 이 세계적으로 유명한 자바 고전 서적 "코어 자바"는 자바의 성장과 함께 쭉 수백만 자바 개발자들의 애용을 받으며 베스트셀러 자바가 되었다. 고전적인 책이며 여러 세대의 기술에 영향을 미쳤습니다.

"Java Core Technology"의 최신 중국어 버전(원서의 12판)은 Java 17의 새로운 기능을 포함하도록 완전히 개정되었습니다. 새 버전은 이전 버전의 훌륭한 전통을 이어가며 수백 가지의 실제 엔지니어링 사례를 사용하여 Java 언어의 핵심 개념, 구문, 중요한 기능 및 개발 방법을 포괄적이고 체계적으로 설명합니다.

객체 지향 프로그래밍, 리플렉션 및 프록시, 인터페이스 및 내부 클래스, 예외 처리, 일반 프로그래밍, 컬렉션 프레임워크 등 Java 언어 및 Java 클래스 라이브러리에 대한 완전한 이해를 바탕으로 독자가 Java에서 제공하는 고급 기능을 유연하게 적용할 수 있도록 하는 데 중점을 둡니다. , 이벤트 리스너 모델, GUI 디자인 및 동시성.

Core Java의 최신 버전인 Volume II가 출시되었습니다.

Java의 아버지는 또한 개발자가 가능한 한 빨리 JDK 8을 포기하고 JDK 17의 장기 지원 버전을 선택할 수 있다고 말했습니다. Java 17의 새로운 기능을 전면적으로 업데이트한 최신판 "Core Java" 12판은 지난해 5월 출시 이후 센세이션을 일으키며 수만 명의 독자들로부터 높은 관심을 받아 왔으며, 그리고 다들 2권 발매를 기대하며 메시지를 남겨주셨어요!

숙련된 프로그래머가 실용적인 애플리케이션을 위한 강력한 코드를 작성하고 싶다면 "Java Core Technology"는 확실히 업계를 선도하는 간결한 책입니다. 자, 드디어 왔습니다! "Java Core Technology Volume II Advanced Features (원서 12판)"가 현재 시중에 나와 있으며 주요 채널 모두 입고되었습니다.

Java 17의 새로운 기능 및 개선 사항을 위해 볼륨 II가 개정되었습니다. 이전과 마찬가지로 모든 챕터가 완전히 업데이트되어 더 이상 사용되지 않는 콘텐츠를 제거하고 다양한 새 API에 대해 자세히 설명합니다.

1권과 2권의 차이점은 무엇인가요?

"자바 코어 기술"을 읽는 방법

이 책을 다 읽고 나면 당신은 진정한 자바 프로그래머가 될 것이다. 이 책은 자바 애플리케이션 설계 및 구현과 관련된 모든 기본 사항과 자바 기능에 대한 심도 있는 이해를 제공할 뿐만 아니라 자바 프로그램을 개발하는 데 필요한 모든 기본 기술을 습득하는 데 도움이 됩니다. 자바를 배우는 길에서 이 책의 도움을 받는다면 당신의 학습은 확실히 반은 노력하고 두 배의 결과를 얻을 수 있을 것이라고 믿는다.

추천

출처blog.csdn.net/m0_64122244/article/details/130544852