这是一个更好的Get成员方法
Which is a better Get member method?
我有一个类,它有一个类型为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方法中哪一种更好,为什么?
我更喜欢选项3:
const std::vector<int>& MyClass::GetMyVector() const
{
return myVector;
}
您的选项1返回了myVector
的副本。这将返回对类成员的const(只读)引用。
为什么要返回向量?
int MyClass::GetItem(const size_t index) const
{
return myVector[index];
}
首先,当您从成员函数返回类的私有成员时,您将公开您的实现,这通常是糟糕的设计。看看@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!
}
正因为如此,返回副本而不是引用通常是正确的做法。
如果通过复制返回对象,那么将其声明为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;
}
根据经验,始终尝试返回类成员的const reference
。所以使用const std::vector<int> & MyClass::GetMyVector() const
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 如何更好地检查两个 char 变量是否在一组值中?
- 有没有更好的方法对C++中的三个整数进行排序?
- 什么模板用法在阶乘中更好
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 比使用 s.str().c_str() 更好的表达?
- 这是一个更好的Get成员方法