作用域和所属关系符号可以重载吗
时间: 2023-12-17 20:03:03 浏览: 25
在 C++ 中,作用域解析运算符 `::` 和成员访问运算符 `.` 和 `->` 可以被重载,但是所属关系符号(`::` 用于表示命名空间,`.` 用于访问对象的成员,`->` 用于访问指针指向的对象的成员)不能被重载。
作用域解析运算符 `::` 可以被用于重载一个命名空间的成员访问运算符,例如:
```c++
namespace MyNamespace {
class MyClass {
public:
void func() {}
};
MyClass operator*(MyClass a, MyClass b) {
return MyClass();
}
}
int main() {
MyNamespace::MyClass a, b, c;
c = a * b; // 调用 MyNamespace::operator*()
return 0;
}
```
成员访问运算符 `.` 和 `->` 可以被用于重载自定义类型的成员访问行为,例如:
```c++
class MyClass {
public:
int x;
MyClass(int x) : x(x) {}
int operator[](int i) const {
return x * i;
}
};
class MyWrapper {
public:
MyClass obj;
MyWrapper(int x) : obj(x) {}
int operator[](int i) const {
return obj[i];
}
};
int main() {
MyWrapper w(10);
int a = w.obj[3]; // 调用 MyClass::operator[]()
int b = w[3]; // 调用 MyWrapper::operator[]()
return 0;
}
```
需要注意的是,重载运算符时应当遵循运算符的一般语义,以避免产生歧义和不符合预期的行为。