“ class:”在C ++中是什么意思?


78

我从没看过 我以为这是“ :: sample”的错字,但是当我看到它确实可以编译时,我感到非常困惑。谁能帮我找出来吗?我不认为这是一个goto标签。

void f() {
  class: sample {
    // there were some members declared here
  } x;
}

5
看起来像一个匿名类(继承自示例)实例x。以前从未见过。也许是C ++ 0x?
ssmir 2011年

1
只是猜测:这可能是源自的未命名类sample吗?
davka,2011年

13
不是goto标签吗?正确,goto顶部class
CB Bailey

4
我什至没有注意到这就是你。Pfft。
Lightness Races in Orbit

@Johannes如果您尚未查看此代码审查建议,请参阅。该站点绝对可以从您的C ++能力中受益。
greatwolf 2011年

Answers:


81

这是一个未命名的类,冒号表示它是从私有继承的sample。看到像

class Foo : private sample
{
    // ...
};

Foo x;

9
哇,真有趣。看来您是对的,范围内有一个类“ sample”,并且该类成员访问基类。现在我明白了。
Johannes Schaub-litb 2011年

2
@Johannes:这是一种非常有限的方法,因为未命名的类不能具有非默认构造函数或析构函数,也不能用作模板(因为它是本地类)。我会对这种结构的用途感到好奇。我对本地类唯一了解的用例是“类型擦除惯用语”(即,返回sample*,但sample此处是不可访问的基类)。
Alexandre C.

@Alexandre它不是在真实代码中发生的。那是我操场上的档案之一。
Johannes Schaub-litb 2011年

1
这不是一个未命名的类实例;这是一个未命名的类。
Lightness Races in Orbit

21

我认为这是定义一个源自的未命名类sample。并且x是该未命名类的变量。

struct sample{ int i;};

sample f() 
{
  struct : sample 
  {
    // there were some members declared here
  } x;
  x.i = 10;
  return x;
}
int main() 
{
        sample s = f();
        cout << s.i << endl;
        return 0;
}

ideone上的示例代码:http : //www.ideone.com/6Mj8x

PS:我改变了classstruct可访问性的理由!


2

那是一个未命名的类。

您可以使用它们来代替C ++ 11之前的局部函数:

int main() {
    struct {
        int operator() (int i) const {                 
            return 42;
        }
    } nice;

    nice(0xbeef);
}

冒号后面紧跟 sample简单的含义,即sample使用默认继承派生。(对于结构:公共,对于类:私有)

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.