通过参考问题

时间:2013-11-14 10:01:49

标签: c++ c++11

我对Pass By Reference相当新,我必须确保我理解正确。我必须把我所有的Heap内存转换成Stack内存,因为我的教授这么说,而且我坚持两个概念。

在课堂中存储参考的最佳方法是什么?我最初将成员对象作为非指针,但注意到当对象(非成员对象)从堆栈弹出时,将在成员变量上调用解构器。这让我觉得它是一个副本,而不是实际的参考。

这是我原来的一个例子:

class B
{
    public:
        B();
        ~B();
};

class A
{
    private:
        B b;
    public:
        A();
        ~A();
        setB(B& bVar);
};

void A::setB(B& bVar)
{
    b = bVar;
}

我的解决方案是将其更改为指针,因此它不会调用解构器,但我不确定这是否是正确的方法。这是我的解决方案:

class B
{
    public:
        B();
        ~B();
};

class A
{
    private:
        B* b;
    public:
        A();
        ~A();
        setB(B& bVar);
};

void A::setB(B& bVar)
{
    b = &bVar;
}

我的第二个问题是有点相关的。我不确定当你有什么时候会发生什么:

object1 = object2&. 

object1是副本还是它实际上是object2的另一个标识符?

1 个答案:

答案 0 :(得分:3)

引用的行为类似于实例的符号别名,并且在某些方面类似于“指针”,它们不能(不应该)为空。为了解释这个问题,我将在下面引用它们,就好像它们是指针一样。

如果您有T&,则表示它指向T,并且本身不是副本。

如果您有T = T&,则表示您将获得副本(或副本的副本),具体取决于构造函数或赋值运算符的定义方式。

如果您有R& = L,则表示您会将L的副本复制到R&所指向的内容中(前提是R的赋值运算符允许此项)。

关于存储参考文献的“正确”方法,我至少会问这些问题:

  • 成员引用在整个包含对象的生命周期内保持不变是否可以接受?
  • 在成员引用所指向的对象之前,是否总是会销毁包含类型的实例?

如果两者都是真的,那么只需声明并适当初始化成员T&就足够了:

class B
{
    // details...
};

class A
{
    B &_b;
public:

    A(B &b) :
    _b(b)
    {}
};

否则,尽管强加给您的要求,情况可能需要shared_ptr<>或类似的东西。

对生活在堆栈上的对象的引用,反过来由其他对象持有,这些对象本身可能构造得比它们的参考生命周期更长,只是等待悬挂的指针。

考虑复制或争论堆分配的内存是更好的选择。

如果您不确定程序引起的参考网络,则需要重新设计它。

编辑:

重要的是要注意,当传递对函数(特别是const T&)的引用时,在某些情况下编译器可以省略它。例如:当内联这样的函数时,引用可以被更有效的寻址逻辑替换,而不是它们被指定为指针。

在这方面,他们不是指针。