今天,我很想在C ++中找到结构和类之间的一些差异。所以,我发现了一些不同之处:
点击此处查看结构,如果模板,则无法使用结构。 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 替换为类,则效果非常好。见这里:http://ideone.com/K8bFn
除了上述差异之外,当我在代码中使用class
替换struct
时,代码可以完美运行而无需进行任何进一步更改。
现在,我想知道,是否存在更多差异,我错过了,我应该知道?
答案 0 :(得分:27)
没有其他区别,但您指定的第三个不正确:
类可以参与模板,而结构则不能。
对于模板,class
关键字只是语法糖,并不意味着类型必须是实际的类。通常,程序员更喜欢typename
用于基本类型,而class
用于类或结构,但这只是按惯例。
除此之外,您可以同时使用class
和struct
来专门化模板。
答案 1 :(得分:4)
主要有两点不同:
如果缺少基类class
的访问说明符,则在声明派生类struct
时假定为public,并在声明类时假定为private。
默认情况下,使用关键字class定义的类的成员是私有的。默认情况下,使用关键字struct
或union
定义的班级成员是公开的。
答案 2 :(得分:1)
结构只是一个默认情况下公开所有成员的类。
根据C ++编程语言(第3版),第10.2.8节:
根据定义,struct是默认情况下成员的类 上市;
struct s{ ...
只是
的简写class s { public: ...
然后他继续说:
我通常更喜欢将struct用于公开所有数据的类。 我认为这类“不太合适,只是数据 结构“。
根据评论编辑:
在第15.3.2节中,它说:
可以省略基类的访问说明符。在这种情况下, 基本默认为类的私有基础和公共基础 对于 struct 。