类(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区别的更多相关文章

  1. Opensturt和Struct区别

    1 OpenStruct和Struct区别,Opestruct你需要创建时,直接给属性赋值,而Struct需要先定义属性后 ,再给属性赋值.选择哪个就看你对属性赋值的时机, 2 Struct和Open ...

  2. 【转】 class 和 struct 区别

    转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...

  3. struct和typedef struct区别

    分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可 ...

  4. C语言union关键字,union和struct区别

    union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间 ...

  5. struct 区别 在C 和C++ 中

    C语言中:   Struct是用户自定义数据类型(UDT).   C++语言中:   Struct是抽象数据类型(ADT),支持成员函数的定义.       在C++中,struct的成员的默认访问说 ...

  6. C++ class、struct区别

    一.默认访问控制不同(最主要) struct默认为public,class默认为private.这个访问控制既是指成员的默认访问属性,又指继承时默认的继承属性. 二.定义template时不同 在模版 ...

  7. C++中的class和struct区别

    1,经过不停的改进,结构体 struct 变得原来越不像它在 C 语言中的样子了: 1,struct 在 C 语言中仅为了定义一个变量的集合,仅此而已,不能定义函数: 2,struct 在 C++ 中 ...

  8. 2.5 C++类class和结构体struct区别

    参考:http://www.weixueyuan.net/view/6337.html 总结: 在C++中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数. 在C++中,s ...

  9. C++中class和struct区别

    1.存储不同 结构体使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation). 栈的空间相对较小.但是存储在栈中的数据访问效率相对较高. 堆的空间相对较大.但是 ...

  10. c# class struct区别

    一句话,前者引用类型,后者值类型,适合高性能的情况,但不可存储大数据.

随机推荐

  1. ios网络协议从http变成https

    最近发了一个很蛋疼的事,iphone16.x以后的系统浏览器自动将http请求切换为https请求了 工程自测 1.在ihone14 pro max,iOS16.1的手机上用http请求是失败的,在i ...

  2. 单例 pickle模块

    今日内容 单例模式实现的多种方式 方式一: class C1: __instance = None def __init__(self,name,age): self.name = name self ...

  3. strapi系列--如何自定义非界面化的接口,定制化自己的业务逻辑

    为什么要进行后端定制呢? 在实际开发过程中,项目中有些需求是不需要创建界面化接口的,需要我们定制化自己的业务逻辑,那么我们该如何处理这个需求呢?本文以图文并茂的形式,定制一个我们自己的业务逻辑接口. ...

  4. (原创)【B4A】一步一步入门02:可视化界面设计器、控件的使用

    一.前言 上篇 (原创)[B4A]一步一步入门01:简介.开发环境搭建.HelloWorld 中我们创建了默认的项目,现在我们来看一下B4A项目的构成,以及如何所见即所得的设计界面,并添加和使用自带的 ...

  5. python字符串表达式求值

    背景: 在开发的过程中涉及到动态的根据公式计算数值 技术上选择了python a= eval("1+2*(3+1)") print(a)

  6. Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to 解决办法

    main.js 配置如下 import Router from 'vue-router'; //路由导航冗余报错(路由重复) const originalPush = Router.prototype ...

  7. JAVA虚拟机08--垃圾回收--HotSpot的算法实现细节

    1 stop the world 2 减少stop the world的时间-OopMap 3 OopMap数据结构的维护-安全点-安全区域 3.1安全点 3.2在垃圾回收时如何让所有线程到达最近的安 ...

  8. 电商网站Web自动化测试实战( 编写京东搜索脚本python+selenium框架)

    电商网站Web自动化测试实战( 编写京东搜索脚本) 1,打开京东页 京东首页地址:https://www.jd.com/,故进入京东首页如下: 2,打开浏览器开发者模式 定位元素前需先打开浏览器开发者 ...

  9. javaEE(多线程、线程通信、线程安全、线程池、线程池工具)

    多线程 多线程的创建 Thread类的方法 线程安全.线程同步 线程通信.线程池 定时器.线程状态.. Thread类 java是通过java.lang.Thread类来代表线程的 按照面向对象的思想 ...

  10. Zstack救急实战记录

    起了这么个标题很容易引起歧义,先说明:是Zstack云架构帮我救急,而不是Zstack系统出了问题被救.具体容我慢慢道来: 使用Docker搭建EPICS的IOC记录 去年暑假时在一台工控机上裸装ce ...