0

我在 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);? 这似乎令人困惑。

谢谢。

4

4 回答 4

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

这是通过引用传递的。

void Class2::method2(int* a);

这是传递指针。其中class2->method2(&a);&是运营商的地址。

于 2013-06-26T14:42:10.040 回答
0

在第一种情况下,该方法接受对变量的引用。意思是如果在里面修改了a method1,函数返回后会被修改。

在第二种情况下,它接受一个指向变量的指针。指针是变量的内存地址。这就是&检索的内容:地址(也就是指向 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( &) 变量。

于 2013-06-26T14:41:44.007 回答
0

第一个是使用对变量的引用来调用的,第二个是使用指针调用的。这两个概念之间存在一些差异。我鼓励你用谷歌搜索,但我现在能想到的最重要的一点是,如果不指向现有对象,就无法构造引用,并且指针可以为 NULL。

于 2013-06-26T14:42:09.070 回答
0

void Class::method1(int &a)表示您是通过a引用传递的,调用者可能会a被修改。

void Class2::method2(int* a)意味着您正在通过a指针传递,调用者可以预期a要修改的内容。

我个人不喜欢按引用传递,因为调用者不会很快知道是否a会被修改,因为按引用传递和按值传递的调用语法是相同的。通过常量引用 void Class::method1(const int &a)传递更好,因为那时a不能修改,如果a是一个大对象,您可以获得不获取值副本的效率。

然而,许多人的看法不同,并说如果函数允许指针为空,则应该通过指针传递;即你的函数可以在没有a输入的情况下做一些有用的事情吗?

于 2013-06-26T14:45:59.373 回答