C++中的struct是对C中的struct进行了扩充,所以增加了很多功能,主要的区别如下图所示:
使用過程:
在C中使用结构体时需要加上struct,或者对结构体使用typedef取别名,而C++可直接使用,例如:
================================================================
结构体声明,C和C++使用同一个
struct Student
{
int iAgeNum;
string strName;
}
typedef struct Student Student2;//C中取别名
struct Student stu1; //C中正常使用
Student2 stu2; //C中通过取别名的使用
Student stu3; //C++使用
================================================================
C与C++实际上编程思想的区别,C是面向过程,C++面向对象
所以在C中结构体就是不同类型数据的集合,并不涉及算法和操作。
而C++是把数据变量及对这些数据变量的相关算法和操作给封装起来
區別 1:内部成员变量及成员函数的默认防控属性
struct 默认防控属性是 public 的,而 class 默认的防控属性是 private 的,例如:
================================================================
struct A
{
int iNum;
}
class B
{
int iNum;
}
A a;
a.iNum = 2; //没有问题,默认防控属性为public
B b;
b.iNum = 2; //编译出错,默认防控属性为private
================================================================
區別 2:默认的继承权限
在继承关系,struct默认是public的,而class是private,例如:
================================================================
struct A
{
int iAnum;
}
struct B : A
{
int iBnum;
}
A a;
a.iAnum = 1; //在struct情况下是正确的,在class情况下是错误的
================================================================
struct的情况下B是默认public继承A的。如果将上面的struct改成class,那么B是private继承A的。
上面的列子都是struct继承struct,class继承class,那么class与struct继承会怎样呢?结论是:默认的防控属性取决于子类而不是基类,例如:
================================================================
struct A{};
class B : A {}; //默认为private继承
struct C : B{}; //默认为public继承
================================================================
所以我们在写代码的时候,为了不引起歧义,最好指明继承的方式,而不要用默认的继承,例如:
================================================================
class B : public A{};
struct B : public A{};
================================================================
區別 3:模板中的使用
class这个关键字还可用于定义模板参数,就像typename。但是strcut不用与定义模板参数,例如:
template<typename T> ok
template<class T> ok
template<struct T> not ok
================================================================
template< typename T, typename Y > //可以把typename 换成 class
int Func( const T& t, const Y& y )
{
//TODO
}
================================================================
區別 4:模板中的使用
struct在C语言中:
在C语言中,我们知道struct中是一种数据类型,只能定义数据成员,不能定义函数,这是因为C语言是面向过程的,面向过程认为数据和操作是分开的,所以C语言中的struct可以直接使用大括号对所有数据成员进行初始化
================================================================
struct test
{
int a;
int b;
};
//初始化
test A={1,2};//完全可以
================================================================
在C++中:
No comments:
Post a Comment