2013-06-26 131 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,你的功能可以做些有用的事情吗?