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



我开始阅读一本关于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 & &;3
  1. 变量是昂贵的,它们占用内存,你只需要它们只要你需要,他们就在你身边。
  2. 变量作用域越大(即变量可见的代码数量越多)你就越有可能错误地使用变量,因此它的值可能会意外地改变。这将是一个bug,祝你好运找到它。
  3. 紧密耦合(这很糟糕)。如果您编写了一个类,并将swap方法放在类,然后编写它,使它使用实例成员x(而不是方法)变量x),那么交换方法只能使用x交换,如果当您需要它交换一个不同的变量(或类上的另一个方法的参数),那么您必须移动值转换成x,这是低效的&goto 5。使用必须要用到的值调用swap函数不是更好吗,而不需要知道必须先设置一个特殊的x变量?
  4. 容易出错。第二个方法会被另一个方法调用吗是否使用交换方法?x的值应该是多少叫什么?你引入了很多关于swap的上下文,并知道它何时调用swap,什么可以调用swap。这很糟糕,任何一段代码越是自包含,那么就越不用担心它,也不用担心它是如何使用的。
  5. 没有其他类可以重用你的swap方法,每个类都需要一个swap方法必须实现它自己,这是一个巨大的no-no的原因我在这里数不清,但可以总结为它违反DRY原则

所有这些问题都可以通过简单的引用传递值来解决。真的有点不需要动脑筋:)

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

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

最新更新