C++可以重新分配引用

C++ makes possible to reassign reference?

本文关键字:分配 引用 新分配 C++      更新时间:2023-10-16
#include <iostream>
using namespace std;
class Base{
    public:
    virtual void f(){
        std::cout << "Basen";
    }
};
class Derived1 : public Base{
    public:
    void f(){
        std::cout << "Derived1n";
    }
};
class Derived2 : public Base{
    public:
    void f(){
        std::cout << "Derived2n";
    }
};


int main() {
    Derived1 d1;
    Derived2 d2;
    Base& ref = d1;
    ref.f();
    ref = d2;
    ref.f();
    return 0;
}

据说不能重新分配参考。在这里,编译器接受此代码,输出对我来说是无法理解的。输出:

派生1 派生1

那么,ref = d2;到底意味着什么呢?

> ref = d2实际所做的是将d2的值分配给d1 - 但是,它仍然是d1 ref 引用的。由于仍引用d1,因此调用ref.f仍会打印Derived1

假设您将一个数据值v添加到基类 - 将其设置为 d1 中的 1d2 中的2。将f的实现更改为打印v。你会得到类似的东西:

#include <iostream>
using namespace std;
class Base{
    public:
    int v;
    virtual void f(){
        std::cout << "Base : v=" << v << "n";
    }
};
class Derived1 : public Base{
    public:
    void f(){
        std::cout << "Derived1 : v=" << v << "n";
    }
};
class Derived2 : public Base{
    public:
    void f(){
        std::cout << "Derived2 : v=" << v << "n";
    }
};
int main() {
    Derived1 d1;
    d1.v = 1;
    Derived2 d2;
    d2.v = 2;
    Base& ref = d1;
    ref.f();
    ref = d2;
    ref.f();
    return 0;
}

运行时,这将打印:

Derived1 : v=1
Derived1 : v=2

希望这使它更清晰一些。

祝你好运。

无法重新分配引用。它们的工作方式类似于变量的别名。

ref = d2调用Base类的运算符Base并将Derived2 d2变量的一部分复制到Derived1 d1