2013-06-26 59 views
0

一些我在C++代碼中看到的是這種結構的方法:如何傳遞參數輸出在C++

void Class::method1(int &a); 

,被稱爲像這樣:

int a; 
class->method1(a); 

但有時我看到結構像:

void Class2::method2(int* a); 

而且這些方法被稱爲是這樣的:

int a; 
class2->method2(&a); 

據我所知,在第一種情況下,該方法接受變量的地址,在第二個指向變量的指針中,對嗎?

有人可以向我解釋這兩種方法之間有什麼區別,什麼時候使用哪種方法?另外,在第一個例子中,似乎一個方法可以採用「int & a」或「int a」,並且在這兩種情況下我們都會以同樣的方式調用它:int a;類 - >方法1(a)的?這似乎令人困惑。

謝謝。

+0

只是給你一些想法。你認爲「int *&」或「int **」是什麼意思?有什麼區別,以及這可能有用。 – dowhilefor

+0

在第二種情況'class2-> method2(NULL);'是可以接受的。這是主要區別。 – andre

回答

0

在第一種情況下,該方法接受變量的reference。 這意味着如果在method1內修改了a,則函數返回後將被修改。

在第二種情況下,它接受變量的pointer。指針是變量的內存地址。這就是&檢索的地址:地址(又名a的指針)。

兩種類型具有基本相同的目的:能夠修改不同範圍的變量。

請參見例如:

void fooPointer (int* pointer) { 
    *pointer += 1; 
} 

void fooReference (int& reference) { 
    reference += 1; 
} 

int main() { 
    int a = 0; 

    std::cout << a; // Ouputs 0 

    fooPointer (&a); 
    std::cout << a; // Outputs 1 

    fooReference (a); 
    std::cout << a; // Outputs 2 
} 

正如你所看到的,讓你在這裏做的一樣。但是使用引用通常更容易且更具可讀性,因爲所有內容都是隱式完成的,所以您不必爲變量設置reference*)或dereference&)。

+0

那麼在第二種情況下,a會在不同的時間進行修改? – user2199745

+0

查看我的更新回答。 – Jerska

0

第一個被稱爲使用對變量的引用,第二個 - 使用指針。這兩個概念之間有一些區別。我鼓勵你這樣做,但現在我能想到的最重要的是,如果不指向現有對象並且指針可以爲NULL,則不能構建引用。

1
void Class::method1(int &a); 

這是通過參考。

void Class2::method2(int* a); 

這是傳遞指針。在class2->method2(&a);,&是操作員的地址。

0

void Class::method1(int &a)表示您通過引用傳遞a,並且調用者可以期望修改a

void Class2::method2(int* a)表示您正在通過指針傳遞a,並且調用者可以期望a指向的內容被修改。

個人而言,我不喜歡按引用傳遞,因爲調用者不會很快知道a將被修改,因爲傳入引用和傳遞值的調用語法是相同的。通過恆定參考void Class::method1(const int &a)更好,因爲從那時起a不能被修改,並且如果a是一個大對象,您可以獲得不採取價值副本的效率。

然而,許多民間人士的意見不同,並說如果函數允許指針爲null,則應該傳遞指針;即不輸入a,你的功能可以做些有用的事情嗎?