c++ - 当按引用传递的参数存储在被调用者对象中,然后被调用者删除时会发生什么?

标签 c++ reference scope pass-by-reference observer-pattern

来自 C,我是 C++ 的“引用”对象概念的新手。为了帮助自己解决这个问题,我对观察者模式的实现进行了稍微修改。

A 类:

class A
{
   public:
      A (int x) : m_x (x) {}

   private:
      int m_x;
}

B 类:

class B
{
   public:
      void Register (A& listener) { m_currentListener = listener; }

   private:
      A& m_currentListener;
}

C 类:

class C
{
   public:
      void RegisterNewDefaultListener ()
      {
         A tempA (42);
         m_observer.Register (tempA);
         m_lastRegisteredListener= tempA;
      }

   private:
      B m_observer;
      A& m_lastRegisteredListener;
}

我担心的是 C#RegisterNewDefaultListener 方法:它创建 A 的本地实例,然后通过引用将其传递到两个不同的地方并存储它离开。

但随后该本地实例立即超出范围,并会被破坏。那些保留该引用的别名会怎样?他们会失效吗?或者在所有对它的引用也消失之前,本地 A 不会消失吗?

最佳答案

很难说出你在问什么。对于初学者,类 B 需要一个构造函数才能编译,正是因为它包含 引用:该引用必须在构造函数中初始化, 之后永远无法更改。 C 也是如此。

当然你也可以用指针达到同样的效果,然后 您可以在构造函数运行后更改它们。并注册 一个局部变量的地址,它的生命周期比 局部变量通常不是一个好主意;如果它是你的听众 感兴趣的,监听器自己一般会做注册, 跟踪它已经注册的位置,并将在其注销自己 析构函数。 (它通常也会在收到 相关事件。)但你没有说你的实际问题是什么。

更一般地说,悬挂引用和指针是一个问题 关于所有语言;由于某种原因,听众变得 无关或不活跃,它必须自行注销。 C++ 不是 在这方面不同于任何其他语言。

关于c++ - 当按引用传递的参数存储在被调用者对象中,然后被调用者删除时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27156879/

相关文章:

c++ - WinAPI SetSystemCursor 和 LoadCursorFrom - 如何设置默认光标?

c++ - 模板类对象的比较器,C++

c++ - 在 C++ 中按值传递字符串和 vector

reference - Visual Studio 2017引用与依存关系

c++ - 我需要在新类中声明构造函数和析构函数吗?

c++ - 使用参数覆盖删除

c# - 维护对结构的引用或重构此代码的其他方式?

java - 变量(可能)超出范围

php - 访问类内函数中声明的变量 (PHP)

perl - "my"与 "local"以及大括号的使用