提问人:CodeBoxRoll 提问时间:9/26/2022 最后编辑:Ken WhiteCodeBoxRoll 更新时间:9/26/2022 访问量:105
结构中类的语义
Semantics of a class within a struct
问:
我正在审查数据结构,在链表方面遇到了一些我从未意识到的东西。这个具体的例子是针对链表的,但我认为这个概念将主要围绕结构中遵循引用语义的属性(值语义)。
情况如下:我声明了一个新节点,并说这个新节点和 LinkedList 中共享相同的引用。然后,我更改 的值。我假设由于新节点和引用内存中的相同空间,它们都会反映更新。然而,事实并非如此。 显示更新“,但新节点不会显示。请参阅下面的代码。head
head
head
head
public struct LinkedList<Value> {
public var head: Node<Value>?
public init() {}
/*
append, push, isEmpty, insert, pop functions
*/
}
public class Node<Value> {
public var value: Value
public var next: Node?
public init(value: Value, next: Node? = nil) {
self.value = value
self.next = next
}
}
var list = LinkedList<Int>()
list.append(1)
list.append(2)
list.append(3)
let node = list.head
list.head = list.head?.next
print(list.head) // prints 2 -> 3
print(node) // prints 1 -> 2 -> 3
由于是一个类,我本来会想到这一点,并且都会反映对任何一个所做的更新。为什么上面的类语义的行为与下面的不同:Node
list.head
node
// Reference type example
class C { var data: Int = -1 }
var x = C()
var y = x // y now points to the same memory address as x
x.data = 42 // changes the instance referred to by x (and y)
println("\(x.data), \(y.data)") // prints "42, 42"
答:
因为你设置并且是类。因此,当变量赋值给类变量时,它会指向内存中存储该类变量的地址。LinkedList
Node
从代码的这 2 行中,您可以看到
let node = list.head
list.head = list.head?.next
第一个是指向存储的内存地址的表示。表示两者此时都分配给相同的内存地址。node = list.head
node
list.head
node
list.head
第二个是指向存储的内存地址的表示。表示两者此时不分配给相同的内存地址。list.head = list.head?.next
list.head
list.head?.next
node
list.head
因此,更改内存地址不会影响当前内存地址的位置。list.head
list.head?.next
node
示例:A -> B -> C ( 这是从LinkedList
)
首先,指向内存 A
list.head
然后,指向内存 A
node
然后,指向内存 B,即 。
list.head
list.head?.next
所以在内存 A 上根本没有改变。
node
评论
下一个:Flutter : 下拉可重用性
评论
y
x
Array