我对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的另一个标识符?
答案 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&
)的引用时,在某些情况下编译器可以省略它。例如:当内联这样的函数时,引用可以被更有效的寻址逻辑替换,而不是它们被指定为指针。
在这方面,他们不是指针。