首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过引用传递参数与使用实例变量

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

Stack Overflow用户
提问于 2011-09-16 21:46:12
回答 2查看 588关注 0票数 2

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

代码语言:javascript
复制
#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";
}

代码语言:javascript
复制
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不是可以在类中的任何地方直接访问吗?(根本不需要指定参数)?提前感谢你的回答!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-16 22:09:14

有几个原因。

  1. 你应该在尽可能窄的scope中声明变量。为什么?看看2&3个
  2. 变量是昂贵的,它们占用内存,你只想在你需要它们的时候使用它们。
  3. 变量scope越大(即变量对多少代码可见),你错误使用变量的机会就越大,因此它的值可能会意外变化。这将是一个错误,祝你好运,寻找一个down.
  4. Tight coupling (这是不好的)。如果您编写了一个类并将交换方法放在类上,并且您编写它使其使用实例成员x (而不是方法变量x),那么交换方法只能使用x进行交换,如果您需要它在不同的变量(或类上的另一个方法的参数)上进行交换,那么您必须将值移动到x中,这是低效的& goto 5。使用您必须处理的值调用交换函数,而不需要知道您必须首先设置一个特殊的x变量,这不是更好吗?
  5. 容易出错。当另一个方法使用交换方法时,第二个方法会被调用吗?在调用之后,x的值应该是什么?您引入了许多有关交换的上下文,并知道何时可以调用swap,以及什么可以调用swap。
  6. 没有其他类可以重用你的交换方法,每个需要交换方法的类都必须实现它自己的交换方法,这是一个巨大的禁忌,原因在这里已经数不清了,但是当它卷积交换方法时,它可以总结出来

所有这些问题都可以通过简单地通过引用传递值来解决。实际上,这是一个很容易理解的问题:)

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2011-09-16 22:01:21

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7445660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档