14

今天,我很想在 C++ 中找到结构和类之间的一些区别。所以,我发现了一些不同之处:

  1. 在结构中,默认情况下成员是公共的,而在类中是私有的。
  2. 默认情况下,结构的继承是公共的,而在类的情况下是私有的。
  3. 类可以参与模板,而结构不能。

单击此处查看在模板的情况下不能使用结构代替类。http://ideone.com/p5G57

template<struct T> void fun(T i)
{
    cout<<i<<endl;
}

int main()
{
    int i=10;
    fun<int>(i);
    return 0;
}

它给出了错误:

prog.cpp:4: error: ‘struct T’ is not a valid type for a template constant parameter
prog.cpp: In function ‘void fun(T)’:
prog.cpp:4: error: ‘i’ has incomplete type
prog.cpp:4: error: forward declaration of ‘struct T’
prog.cpp: In function ‘int main()’:
prog.cpp:12: error: no matching function for call to ‘fun(int&)’

但是,如果将struct替换为class,则效果很好。见这里:http: //ideone.com/K8bFn

除了上述这些差异之外,当我在代码中替换class为时struct,代码可以完美运行而无需进行任何进一步的更改。

现在,我想知道,还有更多的差异,我错过了,我应该知道吗?

4

3 回答 3

27

没有其他区别,但是您指定的第三个不正确:

类可以参与模板,而结构不能。

在模板的情况下,class关键字只是语法糖,并不意味着类型必须是实际的类。通常,程序员更喜欢typename基本类型以及class类或结构,但这只是约定俗成的。

除此之外,您可以同时使用classstruct专门化模板。

于 2012-06-20T11:52:15.457 回答
4

有两个主要区别:

  • 如果 base 没有访问说明符class,则在声明派生类时假定为 public,在struct声明类时假定为 private。

  • 默认情况下,使用关键字 class 定义的类的成员是私有的。使用关键字定义的类的成员structunion默认情况下是公共的。

于 2012-06-20T11:56:08.423 回答
1

默认情况下,结构只是一个所有成员都公开的类。

根据 C++ 编程语言(第 3 版)第 10.2.8 节:

根据定义,结构是一个类,其中的成员默认是公共的;那是

struct s{ ...

只是简写

class s { public: ...

然后他继续说:

我通常更喜欢将 struct 用于所有数据都公开的类。我认为这样的类“不是很合适的类型,只是数据结构”。

根据评论编辑

在第 15.3.2 节中它说:

基类的访问说明符可以省略。在这种情况下,基默认为类的私有基和结构的公共基。

于 2012-06-20T12:10:25.767 回答