经典面试题:你能讲讲class与struct的区别吗?

首先比较一下C中的结构体和C++中的结构体区别

C++中的struct是对C中的struct进行了扩充,所以增加了很多功能,主要的区别如下图所示:

img

上面罗列了在声明时的区别,在使用的过程中也有区别:

在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++是把数据变量及对这些数据变量的相关算法和操作给封装起来

struct和class的区别


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, 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++中:

在C++中对struct的功能进行了扩展,struct可以被继承,可以包含成员函数,也可以实现多态,当用大括号对其进行初始化需要注意:

  • 当struct和class中都定义了构造函数,就不能使用大括号对其进行初始化
  • 若没有定义构造函数,struct可以使用{ }进行初始化,而只有当class的所有数据成员及函数为public时,可以使用{ }进行初始化
  • 所以struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。

加入一个构造函数或是一个虚函数会使strcut更体现出一种对象的特性,而使{}操作不在有效

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值