微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过成员初始化列表初始化类的引用变量时出现问题 代码输出

如何解决通过成员初始化列表初始化类的引用变量时出现问题 代码输出

代码

#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 实际上指的是 k1 所以它指的是不存在的内存。那么为什么访问 a1.p 不会出错。

解决方法

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

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

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

简而言之:您无法创建引用的引用。


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

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

然后将导致 k1 变量的悬空引用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。