我不明白为什么编译器会这样

-4 c++ reference

在处理引用时,我试图“探索”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;
}
Run Code Online (Sandbox Code Playgroud)

然而,真正的问题在于这一行:

f((Persoana&)prof);

//A p object is created which borrows prof's implicit values.
//The reference becomes formal and f function increments "marca" 
Run Code Online (Sandbox Code Playgroud)

为什么它修改“marca”,使其值现在为 101 ?

Sha*_*ger 5

您通过转换为prof对不相关类型的引用并将其传递给使用该引用的对象来调用未定义的行为。任何事情都可能发生。永远不要这样做。

至于观察到的行为,实际上,对于许多编译器(显然包括您的编译器)来说,marca它会被修改,因为它是相关对象的第一个属性;Persoana位于varsta对象存储的开头Persoana,通过欺骗f您传递的内容,它尝试处理对象内部相同大小、相同偏移量的数据Profesor。属性的名称是无关紧要的;无论如何,这些在编译过程中都会被消除,因此 的编译版本f正在寻找“int传递的指针开头的大小的东西”,而不是专门命名的东西varsta,并且在 a 中Profesor,第一件事是marca,所以这就是得到的修改的。