通过引用传递参数vs使用实例变量

时间:2011-09-16 13:46:12

标签: c++ reference instance-variables

我开始阅读一本关于C ++的书,并找到了以下代码。 这是一个关于如何通过引用发送传递参数的示例。

#include <iostream>

void swap(int &x, int &y);

int main()
{
    int x = 5, y = 10;

    std::cout << "Main. Before swap, x: " << x
              << " y: " << y << "\n";
    swap(x, y);
    std::cout << "Main. After swap, x: " << x
              << " y: " << y << "\n";
    return 0;
}

void swap(int &rx, int &ry)
{
    int temp;

    std::cout << "Swap. Before swap, rx: " << rx
              << " ry: " << ry << "\n";

    temp = rx;
    rx = ry;
    ry = temp;

    std::cout << "Swap. After swap, rx: " << rx
              << " ry: " << ry << "\n";
}

Main. Before swap, x:5 y: 10
Swap. Before swap, rx:5 ry:10
Swap. After swap, rx:10 ry:5
Main. After swap, x:10, y:5

逻辑对我来说很清楚。 现在这可能是一个非常愚蠢的问题(我还不是很有经验),但为什么你不能只声明private:int x作为实例变量?在这种情况下,x是否可以在班级中的任何地方直接访问? (根本不需要指定参数)?提前感谢您的回答!

2 个答案:

答案 0 :(得分:3)

有几个原因。

  1. 您应该尽可能以最scope声明变量。为什么?看看2&amp; 3
  2. 变量很贵,占用内存,你只需要它们 只要你需要它们就可以了。
  3. 变量scope越大(即变量可见多少代码) 你误用的可能性越大 变量,因此它的值可能会意外地改变。这将是一个错误,好运狩猎那个。
  4. Tight coupling(这很糟糕)。如果你写一个类并在上面放一个swap方法 class,你编写它所以它使用实例成员x(不是方法 变量x),那么交换方法 CAN ONLY EVER 使用x交换,如果 及时你需要它交换一个不同的变量(或 类的另一个方法的参数)然后你要移动 值为x,这是效率低的&amp; goto 5。用你必须提供的值调用交换函数是不是更好,而不需要知道你必须首先设置一个特殊的x变量?
  5. 容易出错。将另一种方法调用第二种方法 正在使用交换方法? x的值应该在它之后是什么 叫什么名字?你正在介绍大量关于交换的上下文并知道它何时发生 ok可以调用swap,还有什么可以调用swap。这很糟糕,任何一段代码都是自包含的,那么就不必担心它,以及如何使用它。
  6. 没有其他类可以重复使用您的交换方法,每个需要的类都可以 swap方法必须实现它自己,这是一个巨大的 no-no 出于更多原因而不是我在这里可以算,但可以归结为它 贬低DRY Principal
  7. 只需通过引用传递值即可删除所有这些问题。真的很简单:)

    希望这有帮助。

答案 1 :(得分:1)

通过参数将值传递给函数可确保代码中的模块化。听起来你刚刚开始使用C ++,所以我不确定你对面向对象编程有多熟悉。函数/方法代表encapsulation的一层。您的swap()函数应该封装执行其功能/目的所需的逻辑。呼叫者不应该关心如何实现这一点。如果你的swap()函数必须断言程序中有一个全局变量,那么它就不能完全封装“交换”的逻辑。

此外,让我们说你想在你的班级的其他地方重用这个功能。使用一组全局变量来调用此函数将是困难和笨拙的。此外,您的类中可能有其他位置引用这些全局变量,因此您对swap()的其他调用将更改这些值,从而可能导致代码的其他区域出现混淆。