gpt4 book ai didi

c++ - 二传手的引用返回

转载 作者:太空狗 更新时间:2023-10-29 20:38:05 25 4
gpt4 key购买 nike

A.以下通过返回引用对 getter 和 setter 使用相同函数的技巧有多有用/麻烦?

B.在 getter 和 setter 的情况下,在函数声明末尾添加 const 的做法有多好?

#include <iostream>

class A
{
int varReadWrite_;
int varReadOnly_;
int varRestricted_;

public:
A() : varReadOnly_(25) {}
virtual ~A() {}

int& varReadWrite() { return varReadWrite_; }
int varReadOnly() { return varReadOnly_; }
int varRestricted() { return varRestricted_; }
void setVarRestricted(int i); //throwable

};

int main(int argc, char *argv[])
{
A a;
a.varReadWrite() = 45;
std::cout << a.varReadOnly() << a.varReadWrite() << std::endl;
return 0;
}

我选择这个设计的原因是:

  1. 易于访问显式只读或显式可写变量。
  2. 受限的(我不知道还能怎么调用它们)变量,在分配之前需要清理和过滤——这些变量可能需要一个显式的 setter。

使用 boost fusion map也是一个有趣的可能性,因为 shown here

更新

Const 引用成员对变量的只读访问很有趣,例如

class A {
int mA;
public:
int& a;
A(int a_ = 0) : mA(a_), a(mA) {}
};

实际上,这伴随着编写复制和移动构造函数的额外工作,对我来说这是一个可以接受的妥协。

Cpp Reference Copy Construtor says

The implicitly-declared or defaulted copy constructor for class T is defined as deleted if... T has non-static data members that cannot be copied (have deleted, inaccessible, or ambiguous copy constructors);

最佳答案

A. How useful/cumbersome is the following trick of using the same function for getter as well as setter, by returning a reference?

通常不推荐返回对内部成员的引用,因为这样您可以轻松访问其他人,这样他们就可以更改您的对象内部状态,而无需使用对象类 API 提供的任何方法.因此,很难跟踪代码中的此类更改。一般来说,对象内部状态的更改只能通过属于类 API 的方法实现。

B.在 getter 和 setter 的情况下,将 const 添加到函数声明末尾的做法有多好?

如果您指的是为以下方法添加常量:

void PrintState() const

那么一般来说这对 setter 来说没有意义。在这种情况下,Const 意味着此方法不会更改对象状态。因此,您向调用者 promise 说:我不会通过这次调用更改对象状态。一般来说,这是非常好的做法,因为它可以帮助您在设计期间考虑您的方法并查看哪个方法真正修改了对象状态。此外,它是一种防御性编程,因为它是递归的:如果你通过引用(通过指针或引用)将这个对象传递给某个方法,他不能调用 const 方法,除非这个方法也被标记为 const。因此,这可以防止错误地更改对象状态。

关于c++ - 二传手的引用返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com