这更像是一个理论问题,因为我有点好奇。例如,在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++中执行与直接赋值相同的操作。