C++ 将更新源作为引用成员而不是将其传递给更新函数的利弊是什么?
我有一个类,它的实例完全依赖于一个单独类实例的更新。 简化示例:C++ 将更新源作为引用成员而不是将其传递给更新函数的利弊是什么?,c++,C++,我有一个类,它的实例完全依赖于一个单独类实例的更新。 简化示例: #include "Source.h" class ObjectThatNeedsUpdates { public: ObjectThatNeedsUpdates(); void update(const Source& source) { //Update member data with data from source } private:
#include "Source.h"
class ObjectThatNeedsUpdates
{
public:
ObjectThatNeedsUpdates();
void update(const Source& source)
{
//Update member data with data from source
}
private:
//Some member data that needs updating
};
如您所见,每次调用update函数时,都会传递源类的const引用。但最近我认为,如果在构造需要更新的对象时只将引用传递给源对象一次,并让类将引用存储为成员,可能会更符合逻辑,以避免每次更新对象时都必须传递源
因此:
#include "Source.h"
class ObjectThatNeedsUpdates
{
public:
ObjectThatNeedsUpdates(const Source& source)
: source_(source)
{
}
void update()
{
//Update member data with data from source_
}
private:
const Source& Source_;
//Some member data that needs updating
};
这种方法的优缺点是什么?尽你所能表达
update()
调用方和类本身之间的契约
如果需要补充日期的对象的生存期始终包含在源对象的生存期内,并且要使用的源对象永远不会改变,那么我觉得持有对源对象的引用是合同的最佳表达
但是,考虑持有<代码> STD::SysDypPTR < /代码>。这样可以更好地保护你免受终身困扰
就性能而言,将引用作为参数传递给函数非常便宜(与传递指针的成本相同,而传递指针的成本通常与传递大小\u t
的成本相同)。首先,利弊对比什么方法?同样,这样的问题可以被认为是基于意见的。您对这种方法有什么特别的担心吗?每当您考虑使用引用数据成员时,您几乎总是最好使用指针数据成员。使用引用数据成员将禁用编译器生成的赋值,并且通常不可能自己正确地实现它们。类似的推理适用于使用const
数据成员。通常最好将它们实现为private
非const
数据成员,并通过接口保持不变性。参考参数在内部封装方面可能更优雅一些:只有update()
方法需要这样做无需将其作为其他方法的成员公开。无需担心源代码的更改
。性能差异(与构件相比)可以忽略不计。然而,如果你使用一个成本高昂的共享\u ptr
,你首先会与你自己的动机相矛盾…@我认为指针和引用在性能方面几乎没有区别?@cigien你认为什么方法?也许是我在问题中提出的问题?没有考虑到可能出现的终身问题。谢谢,我会把它改成共享的