黑马程序员技术交流社区

标题: struct和类的区别 [打印本页]

作者: 陈福军    时间: 2013-10-30 21:18
标题: struct和类的区别
本帖最后由 陈福军 于 2013-10-31 19:27 编辑

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


作者: 淡忘回忆    时间: 2013-10-30 22:35
Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。
Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。
Int32、Boolean等都属于结构体。
struct可以实现接口
作者: 奔跑的胖子    时间: 2013-10-31 00:28
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
作者: 追溯客    时间: 2013-10-31 07:29
如问题得到解决,请及时把分类修改为"已解决",这样版主才能给你加分!黑马有你更精彩!
作者: 凌晨丶草未眠    时间: 2013-10-31 10:12
不同点:
struct:值类型,栈,不可继承
类: 引用类型,堆,可继承
相同点:都可定义字段,方法等
作者: 特洛伊    时间: 2013-10-31 10:48
struct中默认的成员访问权限是public,而class是private。
作者: 猫咪不吃糖    时间: 2013-10-31 12:54
struct是值类型,性能上有些情况下比class略有优势,功能上被class完美覆盖。

msdn的用struct的条件:
如果类型的实例不大,且通常生存期短或嵌入其他对象,则考虑定义结构而不是类。
不要定义结构,除非该类型具备以下所有特征:
它在逻辑上表示单个值,与基元类型(整型、双精度型等)类似。
它的实例大小小于 16 字节。
它是不可变的。
它将不必频繁被装箱。
作者: 一席倾城    时间: 2013-10-31 13:01
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型
作者: 一席倾城    时间: 2013-10-31 13:02
一席倾城 发表于 2013-10-31 13:01
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,str ...

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

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

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


作者: 茹化肖    时间: 2013-10-31 15:33
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”不用于定义模板参数。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2