*" 및 ".*"."/> *" 및 ".*".">

>백엔드 개발 >C#.Net 튜토리얼 >오버로드할 수 없는 C++ 연산자는 무엇입니까?

오버로드할 수 없는 C++ 연산자는 무엇입니까?

青灯夜游
青灯夜游원래의
2020-12-21 15:20:1514397검색

C++ 연산자에는 다음이 포함됩니다. 1. 조건 연산자 "?:"; 2. 멤버 액세스 연산자 "."; 4. 길이 연산자 "sizeof";5. 연산자 "->*" 및 ".*".

오버로드할 수 없는 C++ 연산자는 무엇입니까?

관련 권장 사항: "C++ 비디오 튜토리얼"

오버로딩: 연산자가 구문을 변경하는 대신 새로운 의미를 갖도록 허용합니다. 그렇지 않으면 혼란이 발생합니다.

오버로딩 규칙 중 일부: 작업 함수의 매개변수 중 하나 이상은 클래스의 객체이거나 클래스 객체에 대한 참조여야 합니다.

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)“->*”和“.*”

오버로드가 가능하다고 가정하고 다음 코드를 살펴보겠습니다.

rrreee

이 연산자의 의미는 exp2와 exp3 둘 중 하나가 오버로드되면 하나, 둘 또는 둘 다 실행되지 않는다는 보장이 없으며 연산자의 점프 속성이 더 이상 존재하지 않습니다. 따라서 "?:"는 오버로드될 수 없습니다.

(2) "."

🎜🎜오버로드가 가능하다고 가정하면 객체를 생성하고 해당 객체의 기능을 호출하는 상황을 가정할 수 있습니다. 🎜rrreee🎜이 예에서 x.fun()은 어떤 fun 함수가 호출되는지 알지 못합니다.
"." 연산자의 의미는 객체 멤버를 참조하는 것이지만 오버로드된 후에는 더 이상 보장되지 않아 연산자의 의미에 대한 혼란이 발생합니다. 🎜🎜🎜 (3) “::”🎜🎜🎜이 연산자는 컴파일 시 도메인 구문 분석만 수행하며 작업에 참여하지 않습니다. 오버로딩 규칙에 따라 연산자가 오버로드되면 새로운 의미가 부여되어 혼란이 발생할 수 있습니다. 🎜🎜🎜(4) "sizeof"🎜🎜🎜오버로드할 수 없는 주된 이유는 많은 내부 포인터가 sizeof에 의존하기 때문입니다. 🎜🎜🎜 (5) "->*" 및 ".*"🎜🎜🎜반원에 대한 참조 포인터🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 소개🎜를 방문하세요! ! 🎜

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

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