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

问题描述 投票:0回答:1

在处理引用时,我试图“探索”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 ?

c++ oop
1个回答
1
投票

您通过将

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

至于观察到的行为,实际上,对于许多编译器(显然包括您的编译器),

marca
会被修改,因为它是相关对象的第一个属性;
Persoana
varsta
位于
Persoana
对象存储的开头,通过向
f
谎报您传递的内容,它会尝试在以下位置处理相同大小的数据:相同的偏移量,在
Profesor
对象内部。属性的名称是不相关的;无论如何,这些在编译过程中都会被消除,因此
f
的编译版本正在寻找“传递的指针开头的
int
大小的东西”,而不是专门命名为
varsta
的东西,并且在
 Profesor
,第一件事是
marca
,所以这就是修改的内容。

© www.soinside.com 2019 - 2024. All rights reserved.