gpt4 book ai didi

c++ - C++ 中的引用更新

转载 作者:行者123 更新时间:2023-11-30 02:29:05 25 4
gpt4 key购买 nike

我有一个关于 C++ 中引用更新的简单问题。考虑以下 C++ 代码:

class A
{
int b;

public:
int& setb();
int getb();
A();
A &operator= (const A &t)
{
cout<<"Assignment called"<<endl;
}
A(int i):b(i) {
cout<<"Copy contructor called"<<endl;
}
};

int A::getb()
{
cout<<this->b<<endl;
}

int& A::setb()
{
return b;
}

A::A()
{
cout<<"constructor called"<<endl;
}

int main()
{
A a;
cout<<"About to set reference"<<endl;
a.setb()=5;
a.getb();

return 0;
}

当我通过引用更新 b 时,值是如何复制的?是否有任何默认的复制构造函数被调用?

最佳答案

至少对我而言,理解这一点的最简单方法是想象您使用的是指针,而不是引用:

int* A::setb()
{
return &b;
}

现在如果你这样做:

*(a.setb())=5;

事情变得很清楚了。引用做完全相同的事情,但没有所有 *& 的庞然大物。您的赋值/复制构造函数与此无关。现在,如果您的字段不是 int,而是某种自定义类型,那么将调用 类型的赋值运算符。您可以在该作业中做任何您想做的事情。

一个有趣的技巧是你的 setb 可能会返回一个“智能引用”类型,它实际上更新了 b,但可能会做更多的事情:

class TwoIntsRef {
public:
TwoIntsRef(int &a, int &b) :
a(a),
b(b)
{}
TwoIntsRef& operator=(int c)
{
cout << "TwoIntsRef Assignment called" << endl;
a = c;
b = c;
return *this;
}
private:
int &a;
int &b;
};

然后你这样做:

TwoIntsRef A::setb()
{
return TwoIntsRef(b, c);
}

还有这个:

a.setb() = 5;

现在它设置了 bc

这实际上是一个非常有用的技巧,可能会做很多事情。在我的一个项目中,我不得不移植严重依赖 Big Endian 字节顺序的遗留代码。为了使其在 Little Endian 硬件上运行,我必须将所有内存访问替换为可以自动交换字节的智能引用。这不是一种非常有效的方法,但却是唯一适用于该特定项目的方法。

关于c++ - C++ 中的引用更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40012628/

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