面试中觉得经常会问到class和struct的区别,今天整理一下。
如果说class可以继承,而struct不可以继承,这是完全错误的。在C++中,这两个关键词并没有大的区别,仅在细节上有些不同。
字面上的区别
(1)在字面上struct是structure的缩写,通常叫做”结构体”,在C语言里用于将多种数据、多个变量组织在一起,便于表达比较复杂的数据类型,在C++中为了兼容C语言保留了该关键字,并且保留了C语言中的所有功能。
(2)而class,则称作“类”,是C++新增来支持面向对象思想概念中“类”的概念的一个关键词,并且比struct具有了更强大的功能,不仅可以像C语言中的struct一样把数据组织在一起,还可以将与数据相关的方法组织在一起,并增加了如虚函数、继承等特性来支持面向对象编程。虽然在字面上struct与class的含义不一样,但在C++中其功能基本是相同的,C++中的struct不仅可以包含数据成员,而且与class一样支持新增的面向对象特性,仅在以下细节上有略微差别。
既然两者在字面上不一样,为了更好地利用这一点,建议在C++中使用struct时仍然只使用C中的特性,来表示一些复杂的数据而不进行方法的封装,这样还可以提高软件的可读性。
默认成员权限区别
struct的成员默认权限是public,而class的成员默认权限是private。默认继承方式
struct的默认继承方式为public,而class的默认继承为private。注意:在C语言中struct不可以继承,虽然我们知道在C++中struct可以继承,但在实际使用中,在不需要继承的场合我们使用struct,而在需要继承的场合使用class,这样更贴近其字面意思,使程序有更好的可读性。
- 用于定义模板参数
模板为C++语言新增特性,C语言没有,只有class可用于定义参数,而struct不可以,
例如:
template<class T>
class TValue
{
private:
T _v;
public:
TValue(T v) : _v(v)
{}
T Get( void )
{
return _v;
}
};
这里只能使用class,不能使用struct,还可以使用typename代替class,class与typename也仅在定义模板参数时可以互换,而且建议此时使用typename,因为这样读起来更接近人类语言,更具有可读性。