在处理引用时,我试图“探索”c++ oop 中的不同情况,但出现了一些奇怪的情况。输出是“31 20”,我确实期望它是这样的。
这是完整版本:
#include <iostream>
using namespace std;
class Persoana {
public:
int varsta;
Persoana(int v = 30) : varsta(v) {}
};
class Profesor {
public:
int marca = 100;
int varsta;
Profesor(int v = 20) : varsta(v) {}
operator Persoana() {
Persoana p;
p.varsta = varsta;
return p;
}
};
Persoana f(Persoana &p){
p.varsta++;
return p;
}
int main(){
Persoana p;
f(p);
cout<<endl<<p.varsta;
Profesor prof;
f((Persoana&)prof);
cout<<" "<<prof.varsta;
return 0;
}
然而,真正的问题在于这一行:
f((Persoana&)prof);
//A p object is created which borrows prof's implicit values.
//The reference becomes formal and f function increments "marca"
为什么要修改“marca”,使其值现在变为 101 ?
您通过将
prof
转换为对不相关类型的引用,并将其传递给使用该引用的对象来调用未定义的行为。任何事情都可能发生。永远不要这样做。
至于观察到的行为,实际上,对于许多编译器(显然包括您的编译器),
marca
会被修改,因为它是相关对象的第一个属性; Persoana
的 varsta
位于 Persoana
对象存储的开头,通过向 f
谎报您传递的内容,它会尝试在以下位置处理相同大小的数据:相同的偏移量,在 Profesor
对象内部。属性的名称是不相关的;无论如何,这些在编译过程中都会被消除,因此 f
的编译版本正在寻找“传递的指针开头的 int
大小的东西”,而不是专门命名为 varsta
的东西,并且在 Profesor
,第一件事是marca
,所以这就是修改的内容。