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区别
一句话,前者引用类型,后者值类型,适合高性能的情况,但不可存储大数据.
随机推荐
- [编程基础] Python中的绝对导入与相对导入
如果您从事的Python项目有多个文件,那么您以前可能不得不使用import语句.即使对于拥有多个项目的Python重度使用者(比如我),import也可能会造成混淆!您可能正在阅读本文,因为您想对P ...
- Python实现k-近邻算法案例学习
一.介绍 你好,我是悦创. 博客首发:https://bornforthis.cn/column/Machine-learning/informal-essay/01.html 本文是由给私教学员 c ...
- python基础23 之初识面向对象
人狗大战 # 编写代码简单实现人打狗 狗咬人的小游戏 """推导步骤1:代码定义出人和狗""" person1 = { 'name': 'j ...
- 阿里云Imagine Computing创新技术大赛决赛启幕!
2023年1月,由阿里云与英特尔主办,阿里云天池平台.边缘云.视频云共同承办的"新算力 新体验"Imagine Computing创新技术大赛复赛圆满落幕.经过两个多月的激烈角逐, ...
- 【力扣】2400. 恰好移动 k 步到达某一位置的方法数目
题目 2400. 恰好移动 k 步到达某一位置的方法数目 解题思路 观察上面示例,容易画出下面的递归树,因此可以考虑DFS. DFS 很容易写出DFS的代码 class Solution { int ...
- Ubuntu 安装 dlib 库时的疑难杂症
解决方法 安装 C/C++环境 sudo apt install gcc sudo apt install g++ 激活 conda 环境 source activate OpenCV pip ins ...
- 图文并茂使用VUE+Quasar CLI开发和构建PWA,registerServiceWorker介绍
看文档 文档地址:Preparation for PWA 1.将PWA模式添加到我们的Quasar项目中: npx quasar mode add pwa 我们看一下有哪些变化 向Quasar项目添加 ...
- Kubernetes(k8s)控制器(一):deployment
目录 一.系统环境 二.前言 三.Kubernetes 控制器 四.Deployment概览 五.创建deployment 六.修改deploy副本数 6.1 kubectl edit deploy ...
- 神经网络基础部件-BN层详解
一,数学基础 1.1,概率密度函数 1.2,正态分布 二,背景 2.1,如何理解 Internal Covariate Shift 2.2,Internal Covariate Shift 带来的问题 ...
- 重学SpringBoot. step5 再学SpringMVC
SpringMVC 参考:<深入浅出 SpringBoot 2.X> 虽然说的是SpringBoot,但把SpringMVC将的很好,正是SpringMVC应用到SpringBoot中非常 ...