cuốn sách gpt4 ai đã làm

c++ - 处理赋值运算符重载;你能重新分配一个引用吗?

In lại Tác giả: Walker 123 更新时间:2023-11-28 08:13:18 hai mươi bốn 4
mua khóa gpt4 Nike

如果你的类有引用变量,那么你的重载赋值运算符就需要写了。

我的印象是你只能在实例化时设置一次引用,因此不能做类似的事情:

MyClass& MyClass::operator=(const MyClass& rhs) 
{
if (&rhs != this)
{
myReference = rhs.myReference;
}
trả lại *cái này;
}

你是如何解决这个问题的?

编辑 - 好的,所以我被告知您不能在带有引用的类上使用赋值运算符,没关系。但是,为什么 visual studio 让我这样做呢?程序运行一切。

câu trả lời hay nhất

不可以,您不能重新安排引用。

考虑:

int a = 42, b = 43;
int &ar = a;
ar = b;

编译器如何知道您正在尝试重新设置 ar 以引用 b,而不是设置 của giá trị Một đến 43?

您通过使用指针而不是引用来解决这个“问题”。

编辑:根据您的编辑,

OK so I'm told you cannot use an assignment operator on a class with a reference, fine. But then why does visual studio let me do it? The program runs and everything.

你的结论前提是错误的。您可以对包含引用的类使用赋值运算符。您不能做的是重新设置引用。如我上面的代码所示,如果您尝试使用 ar = a; 重新分配引用,您不会重新设置 ar 所指的内容,而是更改 what 的值ar 指的是.

Visual Studio 毫无困难地“让您做到”。误解正是 Visual Studio 让你做的。它不会让您重新设置引用。它让你改变引用的值(value)。这是一个示例,我希望它能阐明这意味着什么。

#include 
#include
sử dụng không gian tên std;

class Foo
{
công cộng:
void dump() const
{
cout << "Foo instance " << showbase << this << "\n";
}
};

class Bar
{
công cộng:
Bar(Foo& foo) : foo_(foo) {}
Bar& operator=(const Bar& rhs)
{
foo_ = rhs.foo_;
return * this;
}

void dump() const
{
cout << showbase << "Bar instance " << this << "\t";
foo_.dump();
}

riêng tư:
Foo& foo_;
};

int chính()
{
cout << "foo1: ";
Foo foo1;
foo1.dump();

cout << "foo2: ";
Foo foo2;
foo2.dump();

cout << "bar1 :";
Bar bar1(foo1);
bar1.dump();

cout << "bar2 :";
Bar bar2(foo2);
bar2.dump();

bar2 = bar1;
cout << "bar2 after assign :";
bar2.dump();
}

上面的代码建立了 2 个 Foo 对象(foo1foo2)并创建了 2 个 Bar 对象,每个其中引用了不同的 Foo. Bar 有一个 operator=,它执行以下操作:

foo_ = rhs.foo_;

如果 C++ 允许您以这种方式重新设置引用,foo_ 现在将引用 Foo 的不同实例。但是,事实并非如此。这不会改变 foo_ 所指的内容。相反,它在 Foo 本身上调用 operator=。运行上面的代码,你会看到 bar2 TRONG Foo 的地址永远不会改变。如果您可以重新安排引用文献,它就会改变。

关于c++ - 处理赋值运算符重载;你能重新分配一个引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449467/

hai mươi bốn 4 0
Đề xuất bài viết: c++ - 用户类中的多重签名信号管理
Đề xuất bài viết: c++ - CreateFont API 质量
Đề xuất bài viết: c++ - 如何更新文件的版本?
Đề xuất bài viết: c++ - 检查原始文件 C++ 的输出
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress