gpt4 book ai didi

c++ - 返回对对象的 const 引用

转载 作者:行者123 更新时间:2023-11-27 23:07:16 25 4
gpt4 key购买 nike

我在下面的代码中有冲突。

#include <iostream>
using std::cout;
using std::endl;

class TestApp {
public:

TestApp(int _x = 9) {
cout << "default constructor\n";
}

TestApp(const TestApp &app) {
cout << "Copy constructor\n";
}

~TestApp() {
cout << "destructor\n";
}

void setX(int _x) {
}

const TestApp &operator=(TestApp &obj) {
cout << "= operator\n";
return *this;
}

void setX(int _x) {
cout << "Inside setX\n";
}
};

int main() {
TestApp app1;
TestApp app2;
TestApp app3;
(app1 = app2) = app3; // 1
app1 = app2 = app3; // 2
app1.setX(3)
return 0;
}

我收到此错误:第 1 行 main.cpp:38: 错误:将“const TestApp”作为“const TestApp& TestApp::operator=(TestApp&)”的“this”参数传递会丢弃限定符但是我可以使用 app1.setX(3);

main.cpp:38: error: no match for ‘operator=’ in ‘app1 = app2.TestApp::operator=(((TestApp&)(& app3)))’
main.cpp:28: note: candidates are: const TestApp& TestApp::operator=(TestApp&)

为了让它工作,我应该让 operator= 像:

TestApp &operator=(const TestApp &obj) {
cout << "= operator\n";
return *this;
} // works for 1

TestApp &operator=(TestApp &obj) {
cout << "= operator\n";
return *this;
} // works for 2

为什么如果我删除 const 关键字它会起作用?在第 1 行之后 app1 object is not constant.

最佳答案

您不能分配常量对象。例如考虑这个简单的代码

const int x = 10;
x = 20;

编译器将为第二条语句发出错误,因为 x 是一个常量对象,可能无法分配。

同样适用于语句

(app1 = app2) = app3;

此处表达式 (app1 = app2) 返回可能未分配的常量引用,

常量引用并不意味着它引用的对象本身是常量。考虑以下示例

int x = 10;
const int &rx = x;

x = 20;
rx = 30;

虽然 rx 被定义为常量引用,但您可以更改对象 x 本身。您不能使用引用来分配对象 x,因此编译器将对最后一条语句发出错误。

我们经常在函数的参数声明中使用常量引用,以防止更改它们在函数内部引用的对象。例如

void f( const int &x ) 
{
x = 20; // compilation error
}

int x = 10;

f( x );

所以定义一个非常量对象的常量引用并不能使对象本身成为常量。它仅防止使用此引用更改对象。

而且你只需要定义一个复制赋值运算符

TestApp &operator=(const TestApp &obj) {
cout << "= operator\n";
return *this;
} // works for 1

没有必要将复制赋值运算符定义为

TestApp &operator=(TestApp &obj) {
cout << "= operator\n";
return *this;
} // works for 2

如果您不打算更改正确的操作数。所以定义为常量引用比较好 const TestApp &obj

当然,您可以同时拥有这两个运算符,但拥有第二个运算符没有任何意义。

另一方面,您可能不只有第二个运算符。在这种情况下,您将无法使用将它们分配给其他对象的常量对象。

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

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