0

代码

#include<iostream>
struct A
{
    private:
        
    public:
        int &p,q;
        A(int &k1,int k2):p(k1),q(k2)
        {
            
        }

};

int main()
{
    int x=2;
    A a1(x,3);

    std::cout<<&x<<"\n";
//  std::cout<<&k1<<"\n";    commented out this as it gives error
    std::cout<<&a1.p<<"\n";
    
}

输出

0x6ffe1c
0x6ffe1c

p指的是k1k1指的是x

K1将超出范围权限,因此尝试访问它会出错。但a1.p实际上指的是k1so它指的是不存在的内存。那么为什么访问a1.p不给出错误。

4

1 回答 1

1

您似乎误解了引用的工作原理。

一旦你初始化了一个引用,你就不能再访问引用变量本身了。引用变量的所有使用都将被重定向到被引用的变量。

所以在A构造函数中,k1永远不能使用变量,所有使用它的都会是函数中的x变量。main在编写此答案时,当前显示的代码不能有悬空引用。

简而言之:您不能创建引用的引用。


但是,如果您修改构造函数以按值而不是按引用A获取第一个参数

A(int k1, int k2) : p(k1), q(k2) {}

那么将导致k1变量的悬空引用。

于 2021-07-07T16:03:24.870 回答