为什么我们不能重载运算符 = 在 Kotlin 中



这更像是一个理论问题,因为我有点好奇。例如,在c++中,你可以使用=操作符

class Counter {
public:
Counter(int sec) {
seconds = sec;
}
void display() {
std::cout << seconds << " seconds" << std::endl;
}
Counter& operator = (int c2) {
seconds = c2;
return *this;
}
int seconds;
};
int main() {
Counter c1(20);
c1 = 10;
c1.display();   // 10 seconds
return 0;
}

在Kotlin中,我们可以用&;operator fun&;来重载操作符,但是没有'='的选项

不添加它的原因是什么?

c++有变量的值语义。所以当你声明一个Foo类型的变量x时,在x中有一个实际的Foo。不是指向它的指针,不是引用,不是某种共享对象,而是Foo的实际内存。如果我输入

Foo x = example1();
x = example2();

存储在x中的Foo实例是相同的内存块,并且是该实例决定如何将example2的结果分配给它。这就是operator=的作用。

现在,仍然在c++中,考虑

Foo* x = example1();
x = example2();

这是非常不同的。现在x只存储一个指针:一个简单的数字值,指向实际的Foo。然后当我稍后重新分配它时,我实际上得到了一个指向另一个的指针,完全不同的Foo在内存中的其他地方。一般来说,它与原始指针没有关系,并且Foo类无法决定该指针的分配方式;它只是。c++决定了指针相互赋值的意义,而不是你我这些普通的程序员。

现在,大多数高级语言(基本上是你听到人们谈论的所有语言:Kotlin, Scala, Python, Ruby, Java, Lua等)通常将对象作为指针传递。所以当你在Kotlin中声明一个类型为Foo的变量时,它基本上是一个指向Foo的指针。当你重新赋值那个变量时,你是在重新赋值指针。在像Kotlin这样的高级语言中,没有办法在c++中执行与直接赋值相同的操作。

最新更新