小编lan*_*eky的帖子

当在C中更改变量的值时,是创建了一个新原语还是当前原语是变异的?

我知道'mutable'和'immutable'是应该用来描述对象改变面向对象语言(如Java和Objective C)中的值的能力的术语.但是,我想提出它,因为它与我有关关于原始数据的问题.我知道当我更改包含不可变对象的变量的值时,我实际上是在创建一个新对象.但是,我想知道C中的原语数据是否与不可变对象类似.我的意思是,当我更改保存原始数据的变量的值时,会创建一个新数据并由变量引用.或者现有的基元实际上是否突变/修改了存储的数据值?

编辑#1:

问题#1:我想澄清一些误解(无论是我还是其他人),因为当我说"当我改变保存不可变对象的变量的值时,我实际创建了一个新对象." 当我这样说时,我并不是要将变量赋给现有对象.例如:

// Example 1: I did not mean this
-------------------------
String x = "Hello World";
String y = x;
-------------------------

// Example 2: What I meant is this
-------------------------
String x = "Hello World";
//This will print out "Hello World"
System.out.println(x);

x = "Goodbye World";
//This will print out "Goodbye World"
System.out.println(x);
-------------------------
Run Code Online (Sandbox Code Playgroud)

当然,如示例1所示,将变量y赋给变量x,这是你们提出的情况,只引用变量y到x引用的对象.当然,在这种情况下,没有新的对象; 只有同一个对象"Hello World"被2个变量引用.

我的意思是当例子2中x ="Goodbye World"时,变量x引用一个新的String对象,其值为"Goodbye World",而不是x初始化的第一个String对象"Hello World".String是Java中的Immutable对象.更改String变量值的唯一方法是让变量引用现有对象新String对象.如果没有现有对象("Goodbye World"字符串对象未在任何地方创建),则上面的代码只是创建了一个新的String对象并引用了它.我对吗?如果没有,请纠正我.

问题#2:我想总结答案,尤其是Ulfalizer的答案:

1)实际上有两种形式可以存在变量:

a)"存储器地址" - 对于基本类型数据,C语言中的变量以及Java和目标C就是这种情况.例如:int x = 1.这里的变量x是一个实际的内存地址本身,它的类型为整数,并用值1初始化. …

c java primitive objective-c mutable

4
推荐指数
1
解决办法
1197
查看次数

Kotlin是否支持或将来制定类似于Swift中协议组成的接口组成计划?

到目前为止,我找到的答案可能是“否”,但我想知道将来是否有任何计划支持此功能。这就是Swift中的样子。

协议组成具有SomeProtocol和AnotherProtocol的形式。您可以根据需要列出任意数量的协议,并用&分隔。除了协议列表之外,协议组成还可以包含一个类类型,您可以使用该类类型来指定所需的超类。

protocol Named 
{
    var name: String { get }
}

protocol Aged 
{
    var age: Int { get }
}

func wishHappyBirthday(to celebrator: Named & Aged) 
{
    print("Happy birthday, \(celebrator.name), you're \(celebrator.age)!")
}
Run Code Online (Sandbox Code Playgroud)

kotlin swift

1
推荐指数
1
解决办法
88
查看次数

标签 统计

c ×1

java ×1

kotlin ×1

mutable ×1

objective-c ×1

primitive ×1

swift ×1