C++에는 오버로드할 수 없는 5개의 연산자가 있습니다: "?:", ".", "::", "sizeof", ".*". "." 및 "::" 연산자가 오버로드되면 혼란이 발생할 수 있습니다. ".*" 연산자는 클래스 멤버에 대한 포인터를 참조하기 때문에 많은 포인터가 오버로드될 수 없습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, C++17 버전, Dell G3 컴퓨터.
C++에는 오버로드할 수 없는 5개의 연산자가 있습니다. 즉, "?:" "." "::" "sizeof" ".*" 입니다.
오버로딩: 연산자가 구문을 변경하는 대신 새로운 의미를 가질 수 있도록 허용합니다. 이는 혼란을 야기합니다.
오버로딩 규칙의 일부: 작업 함수의 매개변수 중 최소한 하나는 클래스의 객체이거나 클래스 객체에 대한 참조여야 합니다.
다음은 이러한 연산자가 오버로드될 수 없는 이유를 설명합니다.
(1)?:
오버로드가 가능하다고 가정하면 다음 코드를 살펴보겠습니다.
exp1 ? exp2 : exp3
이 연산자의 의미는 exp2와 exp3 중 하나를 실행한다는 것입니다. 오버로드가 있다고 가정하면 실행이 보장되지 않습니다. . 하나 또는 두 개가 실행되거나 둘 다 실행되지 않으며 연산자의 점프 속성이 더 이상 존재하지 않습니다. 따라서 "?:"는 오버로드될 수 없습니다.
(2).
오버로딩이 가능하다고 가정하면 객체를 생성하고 해당 객체의 함수를 호출하는 상황을 가정할 수 있습니다.
class Y{ public: void fun(); }; class X{ public: Y* p; Y& operator.(){ return *p; } void fun(); } void g(X& x){ x.fun(); }
이 예에서 x.fun()은 어떤 fun 함수가 호출되는지 알지 못합니다.
"." 연산자의 의미는 객체 멤버를 참조하는 것입니다. 그러나 이는 오버로드된 후에는 보장될 수 없으므로 연산자의 의미에 대한 혼란이 발생합니다.
(3)::
이 연산자는 컴파일 시 도메인만 구문 분석되며 작업에 참여하지 않습니다. 오버로딩 규칙에 따라 연산자가 오버로드되면 새로운 의미가 부여되어 혼란이 발생할 수 있습니다.
(4) sizeof
오버로드할 수 없는 주된 이유는 많은 내부 포인터가 sizeof에 의존하기 때문입니다.
(5).*
은 클래스 멤버에 대한 포인터를 나타냅니다.
확장 정보:
오버로드된 연산자에 따른 원칙:
1. 오버로드된 연산자는 다른 기호를 연결하여 만들 수 없습니다. New 연산자.
2. 오버로드된 연산자에는 클래스 유형 또는 열거 유형의 피연산자가 있어야 합니다.
3. 내장형 연산자의 의미는 정수덧셈(+) 등 변경할 수 없습니다.
4. 과부하된 연산자는 연산자의 순서를 보장할 수 없습니다.
5. 클래스 멤버의 오버로드된 함수에는 형식 매개변수에 암시적으로 this 포인터가 기본값이 있습니다.
6. 일반적으로 대입 연산자는 멤버 함수로 정의되고, 산술 연산자는 비멤버 함수로 정의됩니다.
7. 연산자가 클래스가 아닌 멤버 함수로 정의되는 경우 일반적으로 클래스의 친구로 정의됩니다.
8. ==와 !=는 쌍으로 나타나야 합니다.
9. 첨자 연산자 []: const가 아닌 멤버이며 참조를 반환하고, const 멤버는 참조를 반환합니다.
10. * 및 -> 연산자는 매개변수를 표시하지 않습니다.
11. 접두사 ++/-- 증가하거나 감소하는 참조를 반환해야 합니다.
12. 입력 연산자와 출력 연산자는 클래스의 프렌드 함수로 정의되어야 합니다.
더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 소개를 방문하세요! !
위 내용은 C++에서 오버로드할 수 없는 연산자는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!