在C++中创建一个具有引用调用返回值的类函数

Create a class function with call-by-reference return value in C++

本文关键字:引用 调用 返回值 类函数 一个 C++ 创建      更新时间:2023-10-16

对于我的一个cpp程序,我创建了一些类(像往常一样,在私有部分中创建变量,在公共部分中创建用于访问的函数)。但现在我有一个问题,我想通过引用访问这个类中的几个变量,例如,如果我通过getVariable(void)获得它们,我想直接修改它们。我已经编写了第二个函数setVariable(value)。但只有当我只想写入变量时,这个函数才可用
如何解决在公共类函数返回的私有变量中读写的问题
我已经读过这些问题:在C++中通过引用传递类成员函数返回值,在C++中返回类函数的引用并返回整个对象?,但它们不适合我的问题。

示例:

class A  
{
    private:
        int x;
    public:
        int getX(void);
        void setX(int y);
}
int A::getX(void)
{
    return A::x;
}
void A::setX(int y)
{
    A::x = y;
}

我想把它叫做

A testA;
testA.setX(2);
testA.getX() = 5; // Ok, seems a bit strange, but some of my other functions require that...
//A::x is now 5
std::cout << testA.getX();//Output is 5

这可能吗?还是应该重写其他函数?

您需要一个通过引用返回私有成员的函数来修改它,例如:

#include <iostream>
class A
{
    private:
        int a;
    public:
        A(): a(2) {}
        int & mutableA() { return a;}
        void printA() { std::cout << this->a << std::endl; }
};

int main()
{
    A instance;
    instance.printA();
    instance.mutableA() += 2;
    instance.printA();
}

如果你运行这个程序,输出将是:

2
4

在上面的例子中,我们使用函数mutableA()修改成员a(最初它的值为2,之后它为4)。关键元素是函数中的int &返回声明,它告诉编译器,该函数将返回引用,这允许我们修改原始的私有变量。

顺便说一句,我想说的是,这不是很常见的行为——当然有理由这样做,但如果你计划在课堂外修改a,你可能一开始就不希望它是私有的。这显然取决于你的设计,但这是值得考虑的。

您可以返回一个可用于修改的引用:

thing & get_member() {return member;}

您还需要一个const重载,所以您仍然可以从const对象中获取它,但不能更改它:

thing const & get_member() const {return member;}

但是,如果你想不受限制地读写它,为什么它首先是私人的?