为什么用双冒号而不是点?


19

传言说,早期的C ++实现已经使用点运算符来访问名称空间。有观点认为,点比现代双冒号运算符更方便。

引入双冒号背后的原因是什么?


3
令我烦恼的是,C ++允许您::symbol强制其symbol在全局名称空间而不是当前名称空间中进行查找,因此至少这是一件看起来非常令人困惑的事情,并且可能会在语言中引入更多的语法歧义。改为使用点运算符。
Ixrec '16

14
:: C ++命名空间:: resolution :: operator的::可怕::丑陋扩散::到处都是::已知::作为结肠癌::癌症。
梅森惠勒

1
我猜这在语义分析器中引起了混乱。Dot还用于为方法名称添加前缀,这是一个非常相似的概念,可能很难隔离。这是解决此问题的明确方法。
Rápli安德拉什


5
梅森·惠勒(Mason Wheeler)对C的无意义攻击的可怕丑陋扩散没有名字,因为这样的邪恶绝不能用名字来端庄!
杰里·科芬

Answers:


14

正如Jules观察到的那样,事实上,早期的C ++实现(CFront 1.0版之前)都有一个用于范围识别的点。

C with Classes(1980)中也使用了一个点。确实,这是 的简单片段:C语言的抽象数据类型工具1

class stack {
    char    s[SIZE];  /* array of characters */
    char *  min;      /* pointer to bottom of stack */
    char *  top;      /* pointer to top of stack */
    char *  max;      /* pointer to top of allocated space */
    void    new();    /* initialization function (constructor) */
public:
    void push(char);
    char pop();
};

char stack.pop()
{
    if (top <= min) error("stack underflow");
    return *(−−top);
}

(该代码是通常如何在其他地方定义成员函数的示例)

::是补充的一个带类的C引入,以产生C ++。

原因由Stroustrup本人给出:

在带有类的C中,点被用来表示类的成员以及对特定对象的成员的选择。

这是造成一些小混乱的原因,也可以用来构造模棱两可的示例。为了减轻这种情况,::引入它是为了表示类的成员资格,并且.仅保留其作为对象的成员资格。

C ++的历史:1979−1991 [2]第21页-§3.3.1)


  1. Bjarne Stroustrup:“类:C语言的抽象数据类型工具”-贝尔实验室计算机科学技术报告CSTR-84。1980年4月。

  2. Bjarne Stroustrup:“ C ++的历史:1979-1991年”-AT&T贝尔实验室Murray Hill,新泽西州07974。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.