2016-06-10 85 views
0

我已經聲明geta()函數返回一個引用,我必須收集一個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; 
} 
+0

因爲您不能將指向'int'的指針指向指向'int'的指針。更改爲'int * p =&(f.geta());' – 101010

+3

它是「做同樣的事情」,但它不是類型安全的,或者至少不允許由C++的轉換規則隱式地發生。我們認爲價值在概念上與指向這些價值觀的指標不同,如果你想獲取必須寫'&'的地址。如果它不以這種方式工作,那麼具有多級指針的某些操作可以用非常神祕的方式編寫。 –

+0

@101010 ok..but然後我們如何分配* p =&z?是不是分配一個整型指針的int引用? – Omkar

回答

4

不要混淆&和*符號。符號&的含義在表達式和聲明中有所不同。

在表達式中使用時,&表示運算符的地址,該運算符返回變量的地址。

但是,當&用於聲明(包括函數形式參數)時,它是類型標識符的一部分,用於聲明引用變量(別名/備用名稱)。

引用和指針不是一回事。 您可以查看這裏... What are the differences between a pointer variable and a reference variable in C++?

0

好了,你不能assing指針詮釋: 而是你能爲指針分配新的內存和assing價值,它像下面的代碼:

#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; 
} 
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/zp哪些在去引用將給你的價值。 pointer

0

好的答案已經在這裏,所以我借用一些好句子,並試圖爲您提供一個更簡單的簡單答案。

請記住,一個指針是計算機存儲器的地址,當它涉及有星號標誌,這可能意味着做兩件不同的事情:1_definition,2_dereferencing。

這裏值得注意的是你可以在你定義指針的同一行上初始化,或單獨的行。所以這兩個是等價物:

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

幾乎相同兩個任務用&符號(defenition和引用)來完成。您可以:

1_define引用,然而,這裏的一個微妙的特殊規則要注意,你不能在一行中定義的引用而在另一個引用它們。換句話說,只要你定義了必須初始化參考與另一個變量。從那一刻起,它變成了別名!例如如果它被引用到一個int,它的行爲就像是int!(就像你的情況一樣),唯一的區別是它也會有該int的地址,在某個場景的後面

(即使一旦你做出一個對象的引用,它不能被改變後指任何其他對象。)

2_The另一件事是&符號的作用是(如莫尼魯爾·伊斯拉姆米隆的另一種回答說)提取的地址的一個變量。

現在,這些基本的東西后,你就可以看看這個(更好,如果你運行它太):

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,浮子,用戶定義的,等等)的指針,這顯然是無效的(基於C++最基本的規則)。

我已經使用這些鏈接來寫這個答案你:linklinklinklink

我希望它有幫助。

相關問題