A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈福军 中级黑马   /  2013-10-30 21:18  /  2159 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈福军 于 2013-10-31 19:27 编辑

struct和类在运用是有何异同?

评分

参与人数 2技术分 +11 收起 理由
茹化肖 + 10
追溯客 + 1

查看全部评分

11 个回复

倒序浏览
相同点,结构和类里都可以定义方法(老师原话)。不同点,他们值类型不一样,结构是值类型,值类型在堆栈上分配地址,类是引用类型,引用类型在堆上分配地址。类是可继承的 结构不能继承
回复 使用道具 举报
struct和class用法上大同小异。但有本质的区别。
一、struct是值类型,值类型在堆栈上分配地址,而class是引用类型,引用类型在堆上分配地址。
二、堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑。
三、因为结构是值类型,所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用。
注:虽然struct在用法上也可以用new创建实例,但此对象仍然是分配在堆栈上的值类型对象。

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。
Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。
Int32、Boolean等都属于结构体。
struct可以实现接口

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1 最近总是看到你的头像啊

查看全部评分

回复 使用道具 举报
如问题得到解决,请及时把分类修改为"已解决",这样版主才能给你加分!黑马有你更精彩!
回复 使用道具 举报
不同点:
struct:值类型,栈,不可继承
类: 引用类型,堆,可继承
相同点:都可定义字段,方法等

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
struct中默认的成员访问权限是public,而class是private。

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
struct是值类型,性能上有些情况下比class略有优势,功能上被class完美覆盖。

msdn的用struct的条件:
如果类型的实例不大,且通常生存期短或嵌入其他对象,则考虑定义结构而不是类。
不要定义结构,除非该类型具备以下所有特征:
它在逻辑上表示单个值,与基元类型(整型、双精度型等)类似。
它的实例大小小于 16 字节。
它是不可变的。
它将不必频繁被装箱。

评分

参与人数 1技术分 +2 收起 理由
追溯客 + 2

查看全部评分

回复 使用道具 举报
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
一席倾城 发表于 2013-10-31 13:01
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,str ...

类是引用类型:引用类型在堆上分配地址

堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑

  因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用

回复 使用道具 举报
1.默认的继承访问权限。struct是public的,class是private的。如果不知道什么是public继承,什么是private继承的,可以去查书
2.struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
    注意我上面的用词,我依旧强调struct是一种数据结构的实现体,虽然它是可以像class一样的用。我依旧将struct里的变量叫数据,class内的变量叫成员,虽然它们并无区别。其实,到底是用struct还是class,完全看个人的喜好,你可以将你程序里所有的class全部替换成struct,它依旧可以很正常的运行。但我给出的最好建议,还是:当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。
    当然,我在这里还要强调一点的就是,对于访问控制,应该在程序里明确的指出,而不是依靠默认,这是一个良好的习惯,也让你的代码更具可读性。
3.class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。

评分

参与人数 2技术分 +2 黑马币 +12 收起 理由
追溯客 + 6 说的很好!
陈福军 + 2 + 6

查看全部评分

回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马