[C++] 클래스 및 객체(가운데)의 여섯 가지 기본 멤버 함수 클래스(2) -- 연산자 오버로딩 -- 주소 가져오기 및 const 주소 가져오기 연산자 오버로드

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 ; // 日
};

이 두 연산자는 일반적으로 오버로드할 필요가 없으며 컴파일러에서 생성한 기본 주소 가져오기 오버로드를 사용합니다.특수한 경우에만 오버로드가 필요합니다(예: 다른 사람이 지정된 내용을 얻기를 원하는 경우) !

추천

출처blog.csdn.net/Ljy_cx_21_4_3/article/details/132102037