class和struct区别
类(class)
引用类型:将一个对象赋值给另一个对象时,系统不会对此对象进行拷贝,而会将指向这个对象的指针赋值给另一个对象,当修改其中一个对象的值时,另一个对象的值会随之改变。
结构体(struct)
值类型:将一个对象赋值给另一个对象时,会对此对象进行拷贝,复制出一份副本给另一个对象,在修改其中一个对象的值时,不影响另外一个对象。
不同点:
1.struct属于值类型,class属于引用类型
2.class允许被继承,struct不允许被继承
3.class中的每一个成员变量都需要设置初始值或者设置成可选值,需要手动实现构造函数(constructor)来给每个属性设置初始值,否则会被编译器会报错,而struct中的成员变量可以不设置初始值,编译器会自动生成构造函数(constructor)
struct StructTest {
var name: String?
var age: Int?
}
class ClassTest {
var name: String?
var age: Int?
/// 如果不手动实现构造函数,编译器会报错
init(name: String?, age: Int?) {
self.name = name
self.age = age
}
init(name: String?, age: Int?) {
self.name = name
self.age = age
}
}
let structTest = StructTest(name: "abc", age: 10)
let classTest = ClassTest(name: "xyz", age: 20)
print("\(String(describing: structTest))")
print("\(String(describing: classTest.name)), \(String(describing: classTest.age))")
4.class遵守了协议没有实现协议方法会报错,而struct遵守了协议没有实现协议方法不会报错
struct StructTest: Equatable {
/// 如果实现协议方法,编译器不会报错
// static func == (lhs: ClassTest, rhs: ClassTest) -> Bool {
// if lhs.name == rhs.name {
// return true
// } else {
// return false
// }
// }
var name: String?
var age: Int?
}
class ClassTest: Equatable {
/// 如果实现协议方法,编译器会报错
static func == (lhs: ClassTest, rhs: ClassTest) -> Bool {
if lhs.name == rhs.name {
return true
} else {
return false
}
}
var name: String?
var age: Int?
/// 如果不手动实现构造函数,编译器会报错
init(name: String?, age: Int?) {
self.name = name
self.age = age
}
}
let structTest = StructTest(name: "abc", age: 10)
let classTest = ClassTest(name: "xyz", age: 20)
print("\(String(describing: structTest))")
print("\(String(describing: classTest.name)), \(String(describing: classTest.age))")
let structTest1 = StructTest(name: "efg", age: 10)
let classTest1 = ClassTest(name: "xyz", age: 30)
print(structTest == structTest1)
print(classTest == classTest1)
// 打印:StructTest(name: Optional("abc"), age: Optional(10))
// Optional("xyz"), Optional(20)
// false
// true
5.NSUserdefaults: struct不能被序列化成NSData对象,无法解档
6.swift和Object-C混合开发时,Object-C无法调用swift的struct, 因为在Object-C调用swift代码,对象需要继承于NSObject
7.swift的class像Object-C类一样,可以使用kvc、kvo、runtime的相关方法,适用于runtime系统。而这些struct不具备
8.struct也不能遵守NSObjectProtocol协议
9.内存分配:struct分配在栈中,class分配在堆中
知识延伸:“堆”和“栈”的区别,为什么访问struct比class块?
“堆”和“栈”并不是数据结构上的Heap跟Stack,而是程序运行中的不同内存空间。栈是程序启动的时候,系统事先分配的,使用过程中,系统不干预;堆是用的时候才向系统申请的,用完了需要交还,这个申请和交还的过程开销相对就比较大了。
栈是编译时分配空间,而堆是动态分配(运行时分配空间),所以栈的速度快。
从两方面来考虑:
1.分配和释放:堆在分配和释放时都要调用函数(MALLOC,FREE),比如分配时会到堆空间去寻找足够大小的空间(因为多次分配释放后会造成空洞),这些都会花费一定的时间,而栈却不需要这些。
2.访问时间:访问堆的一个具体单元,需要两次访问内存,第一次得取得指针,第二次才是真正得数据,而栈只需访问一次。
参考:https://blog.csdn.net/baidu_40537062/article/details/108349757
class和struct区别的更多相关文章
- Opensturt和Struct区别
1 OpenStruct和Struct区别,Opestruct你需要创建时,直接给属性赋值,而Struct需要先定义属性后 ,再给属性赋值.选择哪个就看你对属性赋值的时机, 2 Struct和Open ...
- 【转】 class 和 struct 区别
转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...
- struct和typedef struct区别
分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可 ...
- C语言union关键字,union和struct区别
union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间 ...
- struct 区别 在C 和C++ 中
C语言中: Struct是用户自定义数据类型(UDT). C++语言中: Struct是抽象数据类型(ADT),支持成员函数的定义. 在C++中,struct的成员的默认访问说 ...
- C++ class、struct区别
一.默认访问控制不同(最主要) struct默认为public,class默认为private.这个访问控制既是指成员的默认访问属性,又指继承时默认的继承属性. 二.定义template时不同 在模版 ...
- C++中的class和struct区别
1,经过不停的改进,结构体 struct 变得原来越不像它在 C 语言中的样子了: 1,struct 在 C 语言中仅为了定义一个变量的集合,仅此而已,不能定义函数: 2,struct 在 C++ 中 ...
- 2.5 C++类class和结构体struct区别
参考:http://www.weixueyuan.net/view/6337.html 总结: 在C++中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数. 在C++中,s ...
- C++中class和struct区别
1.存储不同 结构体使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation). 栈的空间相对较小.但是存储在栈中的数据访问效率相对较高. 堆的空间相对较大.但是 ...
- c# class struct区别
一句话,前者引用类型,后者值类型,适合高性能的情况,但不可存储大数据.
随机推荐
- S2-012 CVE-2013-1965
漏洞名称 S2-012(CVE-2013-1965) 远程代码执行 利用条件 Struts Showcase App 2.0.0 - Struts Showcase App 2.3.14.2 影响版本 ...
- python之路32 网络并发线程方法 线程池 协程
多进程实现TCP服务端并发 服务端: import socket from multiprocessing import Process def get_server(): server = sock ...
- [C++]全面理解C++中的引用
一.引用的本质是什么 说到引用,一般C++的教材中都是这么定义的: 1,引用就是一个对象的别名. 2,引用不是值不占内存空间. 3,引用必须在定义时赋值,将变量与引用绑定. 那你有没有想过,上面的定义 ...
- KMP 与 Z 函数
\(\text{By DaiRuiChen007}\) 一.KMP 算法 I. 问题描述 在文本串 \(S\) 中找到模式串 \(T\) 的所有出现,其中 \(|S|=n,|T|=m\) II. 前置 ...
- 案例:用ajax 方法 解析xml
xml文件 <?xml version="1.0" encoding="utf-8"?> <studentlist> <stude ...
- 今天试试NuxtJS
nuxt可以大幅缩短首屏加载时间 Progressive Web App (PWA) Support 渐进式web应用 简单说 就是让你的web应用表现的就像本地应用一样,可以添加快捷方式 打开的时候 ...
- 转载:SQL分页查询总结
[转载]SQL分页查询总结 开发过程中经常遇到分页的需求,今天在此总结一下吧. 简单说来方法有两种,一种在源上控制,一种在端上控制.源上控制把分页逻辑放在SQL层:端上控制一次性获取所有数据,把 ...
- SQLSERVER 阻塞之 PFS 页到底是什么?
一:背景 1. 讲故事 在 SQLSERVER 的众多阻塞场景中,有不小的一部分是由于 PFS 页上的 闩锁 等待造成的,毕竟写页操作一定是要串行化的,在面对 闩锁(PAGELATCH_X) 等待问题 ...
- Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events
前情提要 IoT 边缘集群基于 Kubernetes Events 的告警通知实现 IoT 边缘集群基于 Kubernetes Events 的告警通知实现(二):进一步配置 概述 在分析 K8S 集 ...
- dev C++ 调试卡住/遇到endl函数卡住
今天调试一个程序,发现编译运行的时候可以正常运行,但是调试的时候总是在endl那里卡住 分享一个链接杀千刀的dev c++的不能单步调试的问题_老宁宁的博客-CSDN博客 #include<io ...