*" 및 ".*"."/> *" 및 ".*".">
집 >백엔드 개발 >C#.Net 튜토리얼 >오버로드할 수 없는 C++ 연산자는 무엇입니까?
C++ 연산자에는 다음이 포함됩니다. 1. 조건 연산자 "?:"; 2. 멤버 액세스 연산자 "."; 4. 길이 연산자 "sizeof";5. 연산자 "->*" 및 ".*".
관련 권장 사항: "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 둘 중 하나가 오버로드되면 하나, 둘 또는 둘 다 실행되지 않는다는 보장이 없으며 연산자의 점프 속성이 더 이상 존재하지 않습니다. 따라서 "?:"는 오버로드될 수 없습니다. 🎜🎜오버로드가 가능하다고 가정하면 객체를 생성하고 해당 객체의 기능을 호출하는 상황을 가정할 수 있습니다. 🎜rrreee🎜이 예에서 x.fun()은 어떤 fun 함수가 호출되는지 알지 못합니다.“::”
🎜🎜🎜이 연산자는 컴파일 시 도메인 구문 분석만 수행하며 작업에 참여하지 않습니다. 오버로딩 규칙에 따라 연산자가 오버로드되면 새로운 의미가 부여되어 혼란이 발생할 수 있습니다. 🎜🎜🎜(4) "sizeof"
🎜🎜🎜오버로드할 수 없는 주된 이유는 많은 내부 포인터가 sizeof에 의존하기 때문입니다. 🎜🎜🎜 (5) "->*" 및 ".*"
🎜🎜🎜반원에 대한 참조 포인터🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 소개🎜를 방문하세요! ! 🎜위 내용은 오버로드할 수 없는 C++ 연산자는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!