为什么 C 引入作用域解析运算符
与 Java 相比,C 提供了独特的作用域解析运算符 (::),而不是依赖仅在点 (.) 运算符上。尽管 Java 在没有单独的运算符的情况下取得了成功,但由于独特的语言功能,C 仍然需要添加这一功能:能够对成员变量和派生类类型使用相同的标识符。
在考虑代码时,这种区别变得显而易见如下例所示:
struct foo { int blah; }; struct thingy { int data; }; struct bar : public foo { thingy foo; };
在这种情况下,bar 结构中的成员变量 foo 和派生类类型 foo 共享相同的名称。为了解决这种歧义,使用范围解析运算符 ::。
当编译器遇到 . 时,它假设左侧操作数是一个对象。相反,:: 表示类型名、命名空间或全局命名空间。这种区别使编译器能够解释如下代码:
test.foo.data = 5; test.foo::blah = 10;
在第一个语句中,test.foo.data 被识别为访问对象 test.foo 的数据成员。在第二个语句中,test.foo::blah 表示访问派生类 foo 的 blah 成员。
因此,C 中的作用域解析运算符充当精确工具,用于解决由于允许相同的值而产生的歧义。成员变量和派生类类型的标识符。
以上是为什么 C 使用作用域解析运算符 (::) 而 Java 不使用?的详细内容。更多信息请关注PHP中文网其他相关文章!