为什么引用在通过指针完成时会中断

Why does referencing break when done through pointers

本文关键字:完成时 中断 指针 引用 为什么      更新时间:2023-10-16

我有一个引用的默认构造函数用于类测试。

class test {
public:
    test(int &input1) : int_test(input1) {};
    ~test() {};
    int & int_test; 
}; 

然后还有 2 个与测试交互的类,如下所示:

class notebook
{ 
public:
    notebook() {};
    ~notebook() {};
    int int_notebook;
};
class factory
{
public: 
    factory() {};
    ~factory(){};
    notebook *p_notebook;
};

如果我用整数初始化测试 (t2(,这将按预期工作:

int _tmain(int argc, _TCHAR* argv[]){
    int var=90;
    test t2(var);
    cout<<t2.int_test; // this gives 90
    var=30;
    cout<<t2.int_test; // this gives 30

一旦我通过第三个类工厂使用指向类笔记本成员的指针初始化测试类:

factory f1;
notebook s1;
notebook s2;
s1.int_notebook=10;
s2.int_notebook=2;
int notebook::*p_notebook= &notebook::int_notebook;
f1.p_notebook=&s1;
test t1(((f1.p_notebook->*p_notebook)));
cout<<t1.int_test; // This gives  10

但是,如果我将f1.p_notebook的指针更改为笔记本 S2 的另一个对象;

f1.p_notebook=&s2;
cout<<t1.int_test; // This gives  10

T1 的 A 的引用成员 (t1.int_test( 不反映指针的更改。 有人可以向我解释为什么吗? 或者我在这里做错了什么。

class CTester
{
    public:
        CTester(int &input1) : int_test(input1)
        {
            std::cout << int_test << std::endl;
        }
        int &int_test;
};
class notebook
{
    public:
        int int_notebook;
};
class factory
{
    public:
        notebook *p_notebook;
};
int main()
{
    factory f1;
    notebook s1;
    notebook s2;
    s1.int_notebook=10;
    s2.int_notebook=2;
    int notebook::*p_notebook = &notebook::int_notebook;
    f1.p_notebook=&s1;
    CTester t1(f1.p_notebook->*p_notebook);
    f1.p_notebook=&s2;
    CTester t2(f1.p_notebook->*p_notebook);
    return 0;
}

这打印

10
2

您的类test引用了 int。 它不知道 int 实际属于哪个对象。 或者它最初是如何访问该 int 的。 让我们分解这行代码:

test t1(((f1.p_notebook->*p_notebook)));

首先是这个:

f1.p_notebook

从该行开始,它是指向 s1 的指针。 现在这个:

f1.p_notebook->*p_notebook

那是 s1 的int_notebook成员。 所以有了这个:

test t1(((f1.p_notebook->*p_notebook)));

您正在将 s1 的int_notebook成员传递给测试的构造函数。 所以现在对象t1引用了 s1 的int_notebook成员。 它不关心您用来获取该成员的模糊间接级别。 它[t1]对f1或f1.p_notebook一无所知。 因此,当您执行此操作时:

f1.p_notebook=&s2;

这对s1.int_notebook绝对没有影响,因此对 t1 的引用成员没有影响。