gpt4 book ai didi

c++ - 运算符关键字和运算符重载模拟

转载 作者:行者123 更新时间:2023-11-28 03:34:35 25 4
gpt4 key购买 nike

我知道我们可以对内部数据类型应用递增和递减,例如:

int a;

a++;
a--;

...等等

但是,在下面的代码中,如果我在 operator int& ( ) { return value; 行中省略了 & },我会得到一个编译错误。请在此处解释如何以及为什么使用 & 使增量成为可能:

#include <iostream>

class Foo {

public:
int value;
operator int& ( ) { return value; }

};


int main ( ) {
Foo p;
p.value = 10;

p++;

std::cout << p << std::endl;

std::cin.get ( );
return 0;
}

最佳答案

这个函数定义:

operator int&() { return value; }

允许将您的类 Foo 转换为对 int 的引用。

这一行:

p++;

无法将 p 递增为 Foo 类型,因为该类没有实现 operator++。但是,它可以通过调用 operator int&() 将 p 转换为对 int 的引用,该调用返回对特定内的 value 的引用Foo 的实例。 value 的引用是 int 类型,可以使用 ++ 递增。因此,代码会就地递增 value

关于返回 in 和对 int 的引用之间的区别,以下代码显示您提到的行为与转换运算符没有区别:

class Foo
{
public:
Foo() : m_value(0)
{
}

int getCopy() { return m_value; }
int& getRef() { return m_value; }
private:
int m_value;
};

int main()
{
Foo f;

// Works
f.getRef()++;

// Does not work on g++ with 'error: lvalue required as increment operand`
f.getCopy()++;
}

当转换运算符返回 int 而不是 int& 时,你不能进行增量操作的原因是增量操作需要一个左值,即可以作为目标的东西一项任务。参见 here了解更多详情。

关于c++ - 运算符关键字和运算符重载模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11378061/

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