在C ++中:
概念是派生类对象,而成员函数不能访问父类的私有成员。但是,如果Parent类的公共成员函数返回私有变量的引用并且Parent类在子类中公开继承并且子类具有从父类调用该函数的函数(在本例中为display()),该怎么办? class(在本例中为show())并获取私有变量x的引用。 a的地址应该匹配x,但我不知道它为什么不同?
enter code here
#include <iostream>
using namespace std;
class test{
int x=10;
public:
int & show();
};
class ChildTest: public test{
public:
void display(){
int a=show();
cout<<&a<<endl;
}
};
int & test::show(){
cout<<&x<<endl; //so this address should match the above address but it //is not matching I don't understand why?
return x;
}
int main()
{
ChildTest obj;
obj.display();
return 0;
}
输出:
0x7ffe5b751bb0
0x7ffe5b751bb4
我不明白地址变更背后的概念是什么,因为我正在传递对私有变量的引用。
答案 0 :(得分:3)
这里只显示局部变量a
的地址(其值为test::x
)
更改为int& a=show();
以显示相同的地址。
答案 1 :(得分:3)
写作时
int a = show();
你说&#34;创建一个名为a
的全新整数变量,并使用show()
的返回值对其进行初始化。即使show
返回int &
,因为您已明确说过&#34;我想要一个新的int
,&#34; C ++创建存储在int
返回引用的show()
中的值的副本。
要解决此问题,请将代码更改为
int& a = show();
这表示&#34;创建一个新的int
引用,并将其绑定到show()
返回的引用所引用的内容。&#34;这样,就没有整数副本,你应该看到相同的地址
请注意,这与继承无关。它纯粹是复制int
与存储引用的功能。
答案 2 :(得分:0)
整数是一个值。例如,如果您使用自定义类而不是整数,则会获得相同的地址。但是,作为值类型,所有Integer变量在内存中都有自己独立的空间。要使用相同的地址,应将变量a
更改为指向Integer值的指针:
void display() {
int* a=show();
cout<<a<<endl;
}
通过该更改,地址应该相同。请注意我删除了输出中的&
。那是因为变量a
现在指向值的地址。要使用该值,请使用*a
。
来源(https://www.cprogramming.com/tutorial/lesson6.html):
指向某事:检索地址
为了让指针实际指向另一个变量 必须具有该变量的内存地址。得到的 一个变量的内存地址(它在内存中的位置),把&amp;标志 在变量名称前面。这使它给出了它的地址。这是 调用address-of运算符,因为它返回内存地址。 方便地,两个&符号和地址 - 以a开头;那是一个 有用的方法来记住你使用&amp;得到一个地址 变量。
例如:
#include <iostream> using namespace std; int main() { int x; // A normal integer int *p; // A pointer to an integer p = &x; // Read it, "assign the address of x to p" cin>>x; // Put a value in x, we could also use *p here cin.ignore(); cout<< *p <<"\n"; // Note the use of the * to get the value cin.get(); }
编辑:在写这篇文章的时候有一个错误,还有其他人回答。