C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。
struct能包含成员函数吗? 能!
struct能继承吗? 能!!
struct能实现多态吗? 能!!!
写如下的代码:
struct A
{
char a;
};
struct B : A
{
char b;
};
这个时候B是public继承A的。如果都将上面的struct改成class,那么B是private继承A的。这就是默认的继承访问权限。所以我们在平时写类继承的时候,通常会这样写:
class B : public A
就是为了指明是public继承,而不是用默认的private继承。
当然,到底默认是public继承还是private继承,取决于子类而不是基类。我的意思是,struct可以继承class,
同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下:
struct A{};
class B : A{}; //private继承
struct C : B{}; //public继承
2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
3)“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
{
char c1;
int n2;
double db3;
};
A a={'p',7,3.1415926}; //定义时直接初始化
也就是说struct可以在定义的时候用{}初始化。
但是c++中struct想要用{}来赋初值,则它必须满足很多的约束条件,这些条件实际上就是让struct更体现出一种数据机构,即表现得和c语言中的struct的行为一模一样。
struct能包含成员函数吗? 能!
struct能继承吗? 能!!
struct能实现多态吗? 能!!!
一、区别
1)默认的继承访问权限。struct是public的,class是private的。写如下的代码:
struct A
{
char a;
};
struct B : A
{
char b;
};
这个时候B是public继承A的。如果都将上面的struct改成class,那么B是private继承A的。这就是默认的继承访问权限。所以我们在平时写类继承的时候,通常会这样写:
class B : public A
就是为了指明是public继承,而不是用默认的private继承。
当然,到底默认是public继承还是private继承,取决于子类而不是基类。我的意思是,struct可以继承class,
同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下:
struct A{};
class B : A{}; //private继承
struct C : B{}; //public继承
2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
3)“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
二、联系
c++中除了上述三点不同,struct和class完全是可以说一样的, 包括对C中struct的特性的兼容也是一样的。
例如,C++中的struct是对C中的struct的扩充,既然是扩充,那么它就要兼容过去C中struct应有的所有特性。C语言中你可以这样写:
struct A //定义一个struct{
char c1;
int n2;
double db3;
};
A a={'p',7,3.1415926}; //定义时直接初始化
也就是说struct可以在定义的时候用{}初始化。
但是c++中struct想要用{}来赋初值,则它必须满足很多的约束条件,这些条件实际上就是让struct更体现出一种数据机构,即表现得和c语言中的struct的行为一模一样。
如果c++中的struct 和 class的行为表现得和c语言中的struct的行为一模一样,则它们都可以通过c语言里用来初始化struct的{}来初始化。这种方式兼容C语言中struct的特性。但是,如果一但struct 和 class的行为和c语言中的struct的行为不完全一样,即不是纯粹的一个数据结构的实现体,则不能通过{}来初始化。
那么如何判断c++中的struct 和 class的行为表现是否和c语言中的struct的行为一模一样呢?请参考我的另外一篇文章:
http://blog.csdn.net/nodeathphoenix/article/details/37672169
注意:
如果c++中的struct 和 class满足一定条件后,像c语言中的struct一样通过{}初始化, 则定义struct 和 class对象时, 不会调用struct 和 class的构造函数的.此时的struct 和 class就像是一个c语言中的struct,它本身是没有构造函数而且编译器也不会帮它生成默认的构造函数的.