为什么我不能直接为指针分配返回的引用?

时间:2016-06-10 05:59:48

标签: c++ pointers

我已声明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;
}

4 个答案:

答案 0 :(得分:6)

不要对&amp;和*符号。符号的含义&amp;在表达式和声明中有所不同。

在表达中使用时,&amp;表示运算符的地址,它返回变量的地址。

然而,当&amp;用于声明(包括函数形式参数),它是类型标识符的一部分,用于声明引用变量(别名/备用名称)。

参考和指针不是一回事。 你可以在这里查看... What are the differences between a pointer variable and a reference variable in C++?

答案 1 :(得分:0)

好吧,你不能把指针指向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;
}

答案 2 :(得分:0)

 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 = &ap = &z表示将a / z的地址分配给p时,取消引用会为您提供值。 pointer

答案 3 :(得分:0)

已经有了很好的答案,所以我借用了一些好的句子,试着为你提供一个更简单的答案。

请记住,指针是计算机内存的地址,当它带有带星号的 时,它可能意味着做两件不同的事情:1_definition, 2_dereferencing。

值得注意的是,您可以在定义指针,或单独行的同一行进行初始化。所以这两个是等价的:

int x=8;
int *ptr=&x; //this is equivalent for
//this:
int *ptr;
ptr=&x;

几乎相同的两个任务使用&符号(defenition和referencing)完成。你可以:

1_define引用,但是,这里要注意的一个微妙的特殊规则,你可以在一行中定义引用并在另一行中引用它们。换句话说,无论何时定义引用,必须使用其他变量初始化引用。从那一刻开始,它变成了别名!例如如果它被引用到int,它的行为就像那个int!(就像你的情况一样),唯一的区别是它也会有那个int的地址,在幕后的某个地方< /强>

(即使您对某个对象进行了引用,也无法在以后将其更改为引用任何其他对象。)

2_&符号所做的另一件事是(正如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!

再次在最后一行中,您尝试将一个类(egint,float,用户定义的等等)分配给指针,这显然是无效的(基于最多) C ++的基本规则。)

我已使用这些链接为您撰写此答案:linklinklink,  link

我希望它有所帮助。