我有一个类std:vector
private:
std::vector<int> myVector;
我创建了Get方法来访问myVector
1. const std::vector<int> GetMyVector() const;
2. const void GetMyVector(std::vector<int>& vec) const;
实施分别如下:
1. const std::vector<int> MyClass::GetMyVector() const
{
return myVector;
}
2. const void MyClass::GetMyVector(std::vector<int>& vec) const
{
vec = myVector;
}
两种Get方法中的哪一种更好,为什么?
答案 0 :(得分:8)
我更喜欢选项3:
const std::vector<int>& MyClass::GetMyVector() const
{
return myVector;
}
您的选项1返回了myVector
的副本。这将返回对类成员的const(so read-only)引用。
答案 1 :(得分:1)
为什么要返回矢量?
int MyClass::GetItem(const size_t index) const
{
return myVector[index];
}
答案 2 :(得分:1)
首先,当您从成员函数返回类的私有成员时,您将公开您的实现,这通常是错误的设计。看一下@ JoachimPileborg的解决方案,以获得如何避免这种情况的例子。
如果要返回副本,则应按值返回。
如果要返回对象的引用,则按引用返回。 然而,请记住,当对象被破坏时,您将最终获得悬挂引用,例如
class Foo {
public:
std::vector<int>& getVec() {
return myVec;
}
private:
std::vector<int> myVec;
};
int main() {
Foo* f = new Foo();
std::vector<int>& myRef = f->getVec();
delete f;
std::cout << myRef.size(); // The demons come! Dangling reference!
}
因此,返回副本而不是引用通常是正确的。
答案 3 :(得分:0)
如果要按副本返回对象,则没有任何意义将其声明为const。而不是
const std::vector<int> MyClass::GetMyVector() const
{
return myVector;
}
我会写
std::vector<int> MyClass::GetMyVector() const
{
return myVector;
}
第二个声明比第一个声明更糟糕,因为它只会混淆用户。目前尚不清楚该类的相应数据成员是否已分配给参数,或者此方法是否对参数进行了一些更改,而未将相应的数据成员分配给参数。
因此,考虑到您建议的变体,我会选择声明
std::vector<int> MyClass::GetMyVector() const
{
return myVector;
}
答案 4 :(得分:-1)
根据经验,总是尝试返回类成员的const reference
。
所以请使用const std::vector<int> & MyClass::GetMyVector() const