通过成员初始化列表初始化 class 的引用变量时出现问题
Problem while initializing reference variable of class through Member initialization list
代码
#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
指的是 k1
而 k1
指的是 x
.
K1
将超出范围,因此尝试访问它会出错。但是 a1.p
实际上指的是 k1
所以它指的是不存在的内存。那么为什么访问 a1.p
不会出错。
您似乎误解了引用的工作原理。
一旦你初始化了一个引用,你就再也不能访问引用变量本身了。所有引用变量的使用都将被重定向到被引用的变量。
所以在A
构造函数中,变量k1
永远不能使用,所有的使用都是main
函数中的x
变量。在编写此答案时当前显示的代码不能有悬空引用。
简而言之:您不能创建引用的引用。
但是 如果您修改 A
构造函数以采用第一个参数 by value 而不是引用:
A(int k1, int k2) : p(k1), q(k2) {}
然后 将导致 k1
变量的悬空引用。
代码
#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
指的是 k1
而 k1
指的是 x
.
K1
将超出范围,因此尝试访问它会出错。但是 a1.p
实际上指的是 k1
所以它指的是不存在的内存。那么为什么访问 a1.p
不会出错。
您似乎误解了引用的工作原理。
一旦你初始化了一个引用,你就再也不能访问引用变量本身了。所有引用变量的使用都将被重定向到被引用的变量。
所以在A
构造函数中,变量k1
永远不能使用,所有的使用都是main
函数中的x
变量。在编写此答案时当前显示的代码不能有悬空引用。
简而言之:您不能创建引用的引用。
但是 如果您修改 A
构造函数以采用第一个参数 by value 而不是引用:
A(int k1, int k2) : p(k1), q(k2) {}
然后 将导致 k1
变量的悬空引用。