C++关键字-struct和class
struct和class有很大的相似性。 但是两者最大的区别就在于思想上,一般来说,struct更适合看成是一个数据结构(纯粹的数据对象,POD结构)的实现体,class更适合看成是一个对象的实现体。
1. 默认的访问权限
struct默认的数据访问控制是public的 calss默认的数据访问控制是private的
struct Foo {
int a;
};
int main()
{
Foo f;
// correct
f.a = 10;
}
class Bar {
int a;
};
int main()
{
Bar b;
// error: ‘int Bar::a’ is private within this context
b.a = 10;
}
2. 默认的继承访问权限
// correct
struct Foo {
int a;
};
struct Bar: Foo {
int b;
};
int main()
{
Bar bar;
// correct
bar.a = 10;
bar.b = 20;
}
class Foo {
int a;
};
class Bar: Foo {
int b;
};
int main()
{
Bar bar;
// error: ‘int Foo::a’ is private within this context
bar.a = 10;
// error: ‘int Bar::b’ is private within this context
bar.b = 20;
}
除此之外,struct可以继承自class,class也同样可以继承自struct,继承访问权限是看子类到底是用的struct还是class
struct A
{
int a;
};
struct B: A //public继承
{
int b;
};
class C: A //private继承
{
int c;
};
3. class可用于定义模板参数,但struct不行
在模板定义语法中class与typename的作用完全一样
template<class T, class Y>
int Func(const T& t, const Y& y)
{
//TODO
}
template<typename T, typename Y>
int Func(const T& t, const Y& y)
{
//TODO
}
4. class和struct在使用大括号{}初始化上的区别
- struct在定义时,如果内部没有构造函数或虚函数,可以用{}初始化(用initializer list对数据进行按顺序的初始化)
- class在定义时,如果内部没有构造函数或虚函数,且所有成员变量全是public的话,class可以用{}初始化
- class和struct如果定义了构造函数或虚函数,则都不能用{}进行初始化