1. 소개
이 기사에서는 날짜 클래스부터 시작하겠습니다. 데이트를 위해 크기를 비교하는 방법은 무엇입니까? 년, 월, 일을 차례로 비교하는 것은 괜찮지만 직접 비교할 수 있습니까?
커스텀 타입의 날짜 클래스에 대해 두 날짜의 크기를 직접 비교하는 것은 잘못되었음을 알 수 있으므로 커스텀 타입의 비교를 구현하기 위해서는 연산자에 특별한 기능을 부여해야 합니다.
여기 있는 몇몇 사람들은 '내가 비교적 작은 함수를 작성할 수 있다'고 생각할 것입니다. 사실이지만 이것은 권장되지 않습니다. 여러 사람이 함께 프로젝트를 작성하는 경우 내 비교함수 함수의 이름은 남들이 생각하는 이름과 다르며, 최종적으로 코드를 결합할 때 특정 함수의 함수 이름을 찾아야 하는데, 이는 결과에 영향을 미칠 것이다. 개발의 효율성. 이러한 상황을 피하기 위해 C++에서는 연산자 오버로딩이라는 개념을 도입했습니다.
그것을 달성하는 방법을 살펴 보겠습니다.
2. 연산자 과부하
C++는 코드의 가독성을 높이기 위해 연산자 오버로딩을 도입했습니다. 연산자 오버로딩은 함수 이름이 특수한 함수이며 반환 값 유형, 함수 이름 및 매개 변수 목록도 있습니다. 반환 값 유형 및 매개 변수 목록은 일반 함수와 유사합니다. .
함수 이름은 다음과 같습니다. 연산자 키워드 다음에 오버로드해야 하는 연산자 기호가 옵니다.
함수 프로토타입: 반환 값 유형 연산자 연산자(매개변수 목록)
참고:
1. operator@와 같은 다른 기호를 연결하여 새 연산자를 만들 수 없습니다.2. 오버로드된 연산자에는 사용자 정의 유형 매개변수가 있어야 합니다.
3. 내장 유형에 사용되는 연산자의 의미는 변경할 수 없습니다. 예: 내장 정수 +는 의미를 변경할 수 없습니다.
4. 클래스 멤버 함수로 오버로드될 때 형식 매개변수는 피연산자 수보다 1 적은 것처럼 보입니다. 멤버 함수의 첫 번째 매개변수가 숨겨진 this이기 때문입니다.
5. 연산자의 피연산자 수는 변경할 수 없습니다. 연산자는 피연산자가 여러 개이므로 오버로드 시 여러 매개변수가 필요합니다.
6、.* :: 크기의 ?: .
위의 5개 연산자는 오버로드할 수 없습니다.
여기서 <:의 오버로드를 작성합니다.
전역 함수로 작성하면 Date 클래스의 멤버 변수에 액세스할 수 없으므로 몇 가지 해결 방법이 있습니다.
1. 멤버 변수를 안전하지 않은 shared 로 변경합니다.
2. 친구를 사용하면 패키지가 파괴됩니다.
3. 많은 멤버 변수를 작성해야 하므로 너무 번거로운 getXXX 인터페이스 작성(Java에서 사용하는 것과 같음) ;
4. 오버로드된 함수를 클래스에 넣으면 클래스의 멤버 변수에 액세스할 수 있으므로 가장 적합합니다.
다음을 다시 작성하여 클래스에 작성해 보겠습니다.
수정 후:
class Date
{
public:
Date(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//拷贝构造
Date(const Date& d)// 拷贝构造对d不做改变,因此加上const防止违法使用
{ //并且对于引用来说,这也是权限的缩小,因此加const会更优
_year = d._year;
_month = d._month;
_day = d._day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
~Date()
{
_year = 0;
_month = 0;
_day = 0;
}
// d1 < d2 等同于 d1.operator<(d2),这里比较的顺序是不能交换的
bool operator<(const Date& d)// 这里省略了第一个参数this
{
if (_year < d._year)
{
return true;
}
else if (_year == d._year && _month < d._month)
{
return true;
}
else if (_year = d._year && _month < d._month && _day < d._day)
{
return true;
}
else
{
return false;
}
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2003, 1, 1);
Date d2(2023, 8, 2);
cout << (d1 < d2) << endl;
cout << (d1.operator<(d2)) << endl;
return 0;
}
작업 결과:
우리는 그것이 옳다고 볼 수 있습니다.
여기에서 우리는 매우 상세합니다. 매개변수는 참조를 사용하여 복사 및 공간 낭비를 줄일 수 있습니다.
3. 주소 및 const 주소 연산자 오버로딩
이 두 기본 멤버 함수는 일반적으로 재정의할 필요가 없으며 컴파일러에서 기본적으로 생성합니다.
class Date
{
public :
Date* operator&()
{
return this ;
}
const Date* operator&()const
{
return this ;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
이 두 연산자는 일반적으로 오버로드할 필요가 없으며 컴파일러에서 생성한 기본 주소 가져오기 오버로드를 사용합니다.특수한 경우에만 오버로드가 필요합니다(예: 다른 사람이 지정된 내용을 얻기를 원하는 경우) !