为什么C ++成员函数使用&在争论?

时间:2012-01-05 05:52:23

标签: c++ class pointers

  

可能重复:
  How to pass objects to functions in C++?
  Operator & and * at function prototype in class

#include <iostream>
using namespace std;

class C {
  public:
    int isSelf (C& param);
};

bool C::isSelf (C& param)
{
  if (&param == this) return true;
  else return false;
}

int main () {
  C a;
  C* b = &a;
  cout << boolalpha << b->isSelf(a) << endl;
  return 0;
}

此代码有效。但在我看来,b->isSelf(a)应该是b -> isSelf(&a),因为isSelf需要C类型的地址?!

[编辑] 其他问题:

1)有没有办法使用pass by value实现这个isSelf函数? 2)实现是否使用按引用传递并通过指针传递正确?

bool C::isSelf1(const C &c)
{
    if (&c == this) {
        return true;
    } else {
        return false;
    }
}

bool C::isSelf2(C c)
{
    if (&c == this) {
        return true;
    } else {
        return false;
    }
}

bool C::isSelf3(C * c)
{
    if (c == this) {
        return true;
    } else {
        return false;
    }
}

int main ()
{
    C c1 (2);
    C * c2 = &c1;
    cout << boolalpha;
    cout << c2 -> isSelf1(c1) << endl; // pass by reference
    cout << c2 -> isSelf2(c1) << endl; // pass by value
    cout << c2 -> isSelf3(&c1) << endl;// pass by pointer
    return 0;
}

5 个答案:

答案 0 :(得分:6)

之间有区别:

bool C::isSelf (C& param)  // pass by 'reference'
               ^^^

bool C::isSelf (C* param)  // pass by 'address'
               ^^^

所以在C对象的第二版本地址(即C*)是预期的,而不是在第一版中。

另请注意,内部第1版和第2版可能类似地实施;但是有一个语法差异。有第3版:

bool C::isSelf (C param)  // pass by value
               ^^^

对于已修改的问题:

  

1)有没有办法使用pass by value实现这个isSelf()函数?

不符合您的要求。因为它创建了一个永远不会匹配的新值。从代码中删除按值传递版本。

除此之外,对于任何函数,通常应选择按值传递按引用传递。你不能同时拥有它们,因为它们的函数调用语法都是相同的,这将导致歧义。

  

2)实现是否使用按引用传递并通过指针传递正确?

它们是正确的,但您可以将它们简化为:

bool C::isSelf(const C &c) const // don't give postfix '1', simply overload
{                          ^^^^^
  return (&c == this);
}

bool C::isSelf(C* const c) const // don't give postfix '3', simply overload
{                          ^^^^^
  return (c == this);
}

另外,请参阅执行此类操作的 const correct-ness 语法。

答案 1 :(得分:3)

问:但在我看来,b-&gt; isSelf(a)应该真的是b - &gt;自主安排(安培;一个)

答:是的,这就是“地址”运营商(&amp;)的运作方式。    但这是一个参考参数

在此链接中查看此示例:

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

void foo(int &y) // y is now a reference
{
    using namespace std;
    cout << "y = " << y << endl;
    y = 6;
    cout << "y = " << y << endl;
} // y is destroyed here

int main()
{
    int x = 5;
    cout << "x = " << x << endl;
    foo(x);
    cout << "x = " << x << endl;
    return 0;
}

PS:

以下是上面的示例输出:

x = 5
y = 5
y = 6
x = 6

答案 2 :(得分:1)

在函数声明中,参数名称前面的&符号表示通过引用传递。在C中,这只能通过指针来完成。但是,通过引用传递,调用者不需要知道参数是通过引用传递的,只是简单地使用该对象。

&字符用于address-of和reference参数声明,这是一个不幸的巧合。请记住,地址传递的声明如下:int isSelf(C *other);

答案 3 :(得分:0)

函数签名中的&意味着该值将作为Alias传递,也就是说,它将是原始变量的确切内存位置。

这与传递地址略有不同,其中参数类型本身是指向您的类型的指针,而不是精确类型。

答案 4 :(得分:0)

在C ++中,具有C& param之类参数的函数将其传递给引用而不是值。这类似于人们通常可以传递指向函数的指针,但它有助于防止指针操作中的一些常见错误。

您可能需要查看此链接的开头:http://www.cplusplus.com/doc/tutorial/functions2/

  

当通过引用传递变量时,我们没有传递副本   它的价值,但我们以某种方式将变量本身传递给   函数以及我们对局部变量所做的任何修改   对作为参数传递的对应变量有影响   对函数的调用。