结构体与类的区别

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,不需要进行任何其他修改,代码就能够完美运行。

现在,我想知道是否还有其他差异我所不知道的,需要注意吗?


3
类可以参与模板,而结构体也可以。这个说法是错误的。你不能使用关键字 struct 作为模板参数中 typename 的等价词,但这只是一个关键字而已。 - David Rodríguez - dribeas
@David Rodríguez,我已经更新了帖子,请查看。 - Green goblin
1
@algogeek 中的 class 在模板中只是一个关键字,与实际类无关(如我在答案中所述)。 - Luchian Grigore
1
是的,在模板声明中不能使用关键字struct,但是可以使用struct来特化一个模板。 - Luchian Grigore
可能是在C++中struct和class的区别是什么?的重复问题。 - Bo Persson
3个回答

27

除了第三个指定的类型不正确之外,没有其他区别:

 

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

在模板的情况下,class关键字只是一个语法糖,它并不意味着类型必须是一个实际的类。一般来说,程序员更喜欢为基本类型使用typename,对于类或结构体则使用class,但这只是一种惯例。

除此之外,你可以使用classstruct来特化模板。


3
+1,我总是使用typename,而我工作的编码规范则规定始终使用class,这导致了一个有趣的冲突……很难不写出你已经习惯的方式。有意地使用其中之一来暗示可能会让你在没有目的的情况下看到目的。 - David Rodríguez - dribeas
1
我总是使用 class。这样,如果我必须在模板参数声明中使用 typename 以表示其它含义,那么代码更易读。此外,class 更容易输入。 - CB Bailey

4
有两个主要的不同点:
  • 如果基类没有访问限定符,当派生类被声明为 struct 时默认为 public,而当被声明为 class 时默认为 private。

  • 使用关键字 class 定义的类成员默认为私有。而使用关键字 structunion 定义的类成员默认为公有。


这是引用吗?来源是什么? - Jesper

1

结构体(struct)本质上是一个默认所有成员都为公有的类。

根据《C++程序设计语言》(第三版)第10.2.8节:

By definition, a struct is a class in which members are by default public; that is

struct s{ ...

is simply shorthand for

class s { public: ...

然后他接着说:

我通常更喜欢使用结构体来表示所有数据都是公共的类。我认为这样的类是“不太合适的类型,只是数据结构”。

根据评论进行编辑::

在第15.3.2节中,它说:

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


我认为这是错误的,因为这两者并不等价。继承访问级别也有所不同。 - Luchian Grigore
@LuchianGrigore:嗯,这两个确实是等价的,但是struct S : Q { class S : public Q { public:的“简写”,因此从示例中不能真正推断出“简写”。 - CB Bailey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接