C++;吸气剂返回 什么是C++的GETTER方法的最佳实践,它应该返回非平凡类型,但它是类型类或Stut.的成员。 按值返回,例如:MyType MyClass::getMyType(){Return mMyType;} 按常量引用返回:constmytype&MyClass::getMyType(){Return mMyType;} 按地址返回:MyType*MyClass::getMyType(){Return&mMyType;}

C++;吸气剂返回 什么是C++的GETTER方法的最佳实践,它应该返回非平凡类型,但它是类型类或Stut.的成员。 按值返回,例如:MyType MyClass::getMyType(){Return mMyType;} 按常量引用返回:constmytype&MyClass::getMyType(){Return mMyType;} 按地址返回:MyType*MyClass::getMyType(){Return&mMyType;},c++,getter,C++,Getter,在哪里 我特别担心这种方法的以下用法。如果function()希望保存该对象以供进一步使用,请详细说明这可能会对复制该对象产生什么影响,以及挂起引用和大量指针的危险 MyType* savedPointer; SomeType function(MyType* pointer) { savedPointer = pointer; }; a。有效期为1年。二, { MyType t = myClass.getMyType(); function(&t); } // is sa

在哪里

我特别担心这种方法的以下用法。如果
function()
希望保存该对象以供进一步使用,请详细说明这可能会对复制该对象产生什么影响,以及挂起引用和大量指针的危险

MyType* savedPointer;

SomeType function(MyType* pointer) { savedPointer = pointer; };
a。有效期为1年。二,

{
  MyType t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
{
  const MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
{
  MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
b。有效期为1年。二,

{
  MyType t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
{
  const MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
{
  MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
c。有效期为1年。二,

{
  MyType t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
{
  const MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
{
  MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
d。有效期为3天

{
  MyType* t = myClass.getMyType();
  function(t);
}

// is savedPointer still valid here?

如果
myClass
是类型为
myClass

的对象,则可以提供常量和非常量版本:

MyType       & MyClass::getMyType()       { return mMyType; }
MyType const & MyClass::getMyType() const { return mMyType; }
我不会提供指针版本,因为这意味着返回值可能是空指针,在本例中它永远不会是空指针

然而,真正的问题是,您基本上是让调用者直接访问内部对象。如果这是您的意图,那么您也可以将数据成员公开。如果不是,则需要更加努力地隐藏对象


一个选项是保留
MyType常量&
访问器,但提供更间接的方法来修改内部对象(
setMyType(…)
或更适合于您试图在包含类级别表达的语义的东西)。

我将始终返回常量引用。如果需要修改它返回的值,只需使用setter函数

a)
MyType t=
将为1和2创建对象的副本。一旦t超出范围,保存的指针将无效

b) 保存的指针对于返回引用的案例有效,但对于返回对象的案例无效。对于引用,指针的生存期将与myClass相同。当然,const ref上的&t将是const t*而不是t*,因此无法在调用
函数(MyType*)
时强制转换

c) 与b相同,但代码对于2无效,因为您无法将
const MyType&
强制转换为
MyType&
。一般来说,这是一种不好的做法,const格式更容易接受

d) savedPointer将具有与myClass相同的生存期


我通常倾向于返回引用或常量引用,这取决于您对返回值的期望。如果返回一个引用(非常量),则可以执行如下操作:
myClass.getMyType()=…
,而如果返回常量引用,则对象是只读的。

按值返回,例如:
MyType myClass::getMyType(){return mMyType;}
,因为您将复制对象的内容。我看不出你能得到什么好处,但我看到了性能上的缺点

通过常量引用返回:
constmytype&MyClass::getMyType(){Return mMyType;}
通常是这样使用的:

const MyType& MyClass::getMyType() const { return mMyType; }
MyType& MyClass::getMyType() { return mMyType; }
始终提供常量版本。非常量版本是可选的,因为它意味着有人可以修改您的数据。这是我鼓励你使用的

按地址返回:
MyType*MyClass::getMyType(){Return&mMyType;}
通常在数据可选存在时使用。在使用之前,通常必须对其进行检查

现在,在您的用例中,我强烈建议不要将指针保存为超过一个范围。我经常会导致所有权问题。我想你必须这样做,看看

对于您的示例,有两种情况:

a。右大括号结束后,savedPointer将不再有效


b、 c和d。savedPointer在右大括号后有效,但请注意它不应超过myClass。一般来说,您应该选择按值返回,除非 明确希望保证引用将指定 成员(它公开了部分实现,但是 在诸如
std::vector::operator[]
)之类的情况下是理想的。返回 引用可以防止以后在类中进行更改,因为它意味着 不能返回计算值。(这一点尤其重要 如果类被设计为基类,则很重要,因为 返回引用会对所有派生的 班级。)

您应该通过指针返回的唯一时间是查找或 有些事情牵涉其中,在不得不返回时可能会返回 空指针

返回对const的引用可能是有效的优化,如果 探查器在此处指示性能问题,以及调用 站点还可以处理const引用(不修改 返回值,对象的生存期没有问题)。信息技术 必须根据图纸上的附加约束进行权衡
当然是实现,但在某些情况下,它是合理的。

这在很大程度上取决于上下文。您希望看到类内部的修改(例如修改向量元素),还是希望只包含该值,而不(!)对原始值进行任何修改?在我看来,一般不应该使用指针。容器类型应该按ref或const-ref返回,其余的按值返回(甚至根本没有getter!)。类的要点是数据封装(以及其他特性)。总是通过非常量引用返回将是愚蠢的。您还可以返回智能指针,这会让您省去很多担心…@jbat100您不能在此处返回智能指针。没有动态分配的对象(也不应该有)。@JamesKanze同意,要返回智能指针,实例变量必须是智能指针,这就是我所说的meant@jbat100但为什么要将实例变量设置为智能指针?@Simple:绝对正确。我正要去那里…这里的警告是