为什么我不能直接将返回的引用分配给指针?
Why i can't assign a returned reference to a pointer directly?
我已经声明了geta()函数来返回对a的引用,我必须在int指针中收集该引用。 代码工作正常,但为什么我无法使用注释行。它不是在做同样的事情吗? 代码如下:
#include<iostream>
using namespace std;
class Foo
{
int a=6;
public:
int& geta()
{
return a;
}
};
int main()
{
Foo f;
int &z = f.geta(); //int *p = f.geta(); Why this doesn't work?
int *p = &z;
cout << *p;
}
不要与 & 和 * 符号混淆。符号的含义在表达式和声明中是不同的。
当它在表达式中使用时,&表示地址运算符,它返回变量的地址。
但是,当在声明中使用 & 时(包括函数形式参数),它是类型标识符的一部分,用于声明引用变量(别名/备用名称)。
引用和指针不是一回事。你可以在这里查看...C++中的指针变量和引用变量有什么区别?
好吧,你不能断言指向 int 的指针: 相反,您可以为其分配新的内存和断言值,如以下代码:
#include <iostream>
#include <string>
using namespace std;
class Foo
{
int a;
public:
Foo():a(6) {}
int& geta()
{
return a;
}
};
int main()
{
Foo f;
int *p = new int;
*p = f.geta();
//int *p = &z;
cout << *p;
}
using namespace std;
class Foo
{
public:
int a;
int& geta()
{
return a;
}
};
int main()
{
Foo f;
f.a = 6;
int &z = f.geta(); //int *p = f.geta(); Why this doesn't work?
z = 10; // 'z' is nothing but 'a'
int *p = &z;
cout << *p;
}
你可以在上面看到z
只不过是a
。 两者都指向相同的内存。int *p
是一个包含地址的指针。所以要么你可以p = &z;
或*p = z;
int *p = f.geta();
表示您正在分配对指针变量的引用,表示a
地址*p
无效。 当p = &a
或p = &z
表示将a
/z
的地址分配给p
取消引用时将为您提供值。 指针
好的答案已经在这里了,所以我借用了他们的一些好句子,并尝试为您提供一个更简单的答案。
请记住,指针是计算机内存的地址,当它带有星号时,它可能意味着做两件不同的事情:1_definition、2_dereferencing。
这里值得注意的是,您可以在定义指针的同一行或单独的行上进行初始化。所以这两个是等价的:
int x=8;
int *ptr=&x; //this is equivalent for
//this:
int *ptr;
ptr=&x;
几乎相同的两个任务是用 & 符号(防御和引用)完成的。您可以:
但是,1_define引用,这里有一个微妙的特殊规则需要注意,您不能在一行中定义引用并在另一行中引用它们。换句话说,每当定义引用时,都必须使用另一个变量初始化引用。从那一刻起,它就变成了它的别名!例如,如果它被引用到一个 int,它的行为真的很像那个 int!(就像你的情况一样),唯一的区别是它也会有那个int的地址,在幕后的某个地方。
(即使对某个对象进行了引用,以后也无法将其更改为引用任何其他对象。
2_The符号所做的另一件事是(正如Monirul Islam Milon在另一个答案中所说)提取变量的地址。
现在,在这些基本内容之后,您已经准备好查看以下内容了(如果您也运行它,则更好):
int main()
{
int j=25;
int* ptr;
ptr = &j;
int& ref1 = j, ref2 = *ptr;
//-------int& ref3 = ptr; // <-------- error!
//-------You can not assign an address to an int!
//-------Remember that in the valid examples above, ref1 and ref2 are really nothing but j
cout << "j is: " << j << endl;
cout << "ref1 is: "<< ref1 << 't' << "ref2 is: " << ref2 << endl;
cout << "They are both aliases for j";
在按引用传递函数中,同样的事情会发生,对象本身被发送到这些函数,尽管作为参数保存在别名(备用名称)中。 另请注意,在引用返回函数中,您不是返回地址,而是通过其别名(通过对它的引用)返回对象本身 - 无论它是什么。所以:
class_name& foo2(){
static class_name x=something;
return x;
} //OK
//but:
//-------int *ptr2 = foo2(); // <-------error!
同样在最后一行,您尝试将一个类(例如int,float,用户定义的类等)分配给指针,这显然是无效的(基于最基本的C++规则)。
我用这些链接为你写了这个答案:链接,链接,链接, 链接。
我希望它有所帮助。
- 对具有动态分配的内存和析构函数的类对象的引用
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 如何在构造函数中构造对象并分配引用
- C++中的可重新分配引用
- 如何分配引用链的末端
- c++ 在 if 语句中分配引用变量
- 为什么不能重新分配引用的目标对象?
- 阻止重新分配引用
- C++ 从传入的引用变量中分配引用变量
- C++可以重新分配引用
- 重新分配C++引用变量
- 有条件地分配引用
- 我们可以在C++中重新分配引用吗
- C++在为指针分配引用时获取临时错误的地址
- 为什么可以在 for 语句中重新分配引用常量
- 如何(优雅地)根据字符别名分配引用成员
- 处理赋值运算符重载;您可以重新分配引用吗?
- 对左值和右值的可分配引用