gpt4 book ai didi

c++ - 将内置类型变量传递给只有一个类类型参数的 "+"运算符函数时自动类型转换的构造函数

转载 作者:行者123 更新时间:2023-11-30 03:13:00 27 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>
using namespace std;

class test {
public:
test() {
for (int i = 0; i < 5; i++)
this->arr[i] = 0;
}
test(int val) {
for (int i = 0; i < 5; i++)
this->arr[i] = val;
}
test(int* a) {
for (int i = 0; i < 5; i++)
this->arr[i] = a[i];
}
test operator +(test& sub) {
int arr1[5];
for (int i = 0; i < 5; i++) {
arr1[i] = this->arr[i] + sub.arr[i];
}
return test(arr1);
}
void display() {
cout << "The array is: ";
for (int i = 0; i < 5; i++) {
cout << this->arr[i] << "\t";
}
}
private:
int arr[5];
};

int main() {
int x = 5;
test obj1(5), obj2(1);
obj2 = obj1 + x; //Error here
obj2.display();
return 0;
}

它试图通过添加两个对象的“arr”成员变量来测试重载“+”运算符,返回一个包含结果的对象并将其分配给主函数中的 obj2。然而,根据“绝对 C++”一书,也可以将整数传递给“+”函数,就像现在一样,首先通过“测试”类中的构造函数将整数转换为“测试”类型,因为此构造函数接受整数类型的变量作为其参数。然后,具有“x”值的结果对象将被传递给“+”函数,它会正常工作。

但是,代码无法编译,尝试此操作时出现错误:没有与这些操作数匹配的“+”运算符。那么,在解释本书的详细信息时,我的代码中可能存在什么问题?

最佳答案

你得到编译错误的原因是因为 operator+接受非常量左值引用。

如果更改运算符(operator)的签名以取 const test&它将能够绑定(bind)到一个右值,这将编译。

test operator +(const test& sub) {
...
}

由于方法没有修改sub它应该采用 const-ref。

编辑:const由于值类别,关键字在这里有重要的区别。首先让我们看一个简单的例子。

void foo(int& i) {
i = 5;
}

int b;

foo(b); //this is ok
foo(7); //this is not ok

我们指定我们想要一个左值引用。这意味着我们可以传入一个变量,但不能传入一个临时变量。在这种情况下,临时变量是文字,但它也可以是另一个函数的返回值。

如果我们回到你的问题,当你写 obj1 + x您已经知道从 int 发生了转换至 test .该转化的返回值是一个临时值。

如果我们想处理一个右值(一个临时的),我们需要使用一个右值引用。

void foo(int&& i) {
i = 5;
}

int x;

foo(x); // Now this will fail instead
foo(5); // This will however work

当我们使用 const&我们是说我们不会修改这个值,既然我们已经 promise 不会修改它,那么它是否是临时的并不重要。无论如何,我们只会从中读取。

这就是为什么 const&可以绑定(bind)到左值或右值。

void foo(const int& i) {
std::cout << i;
}

int x = 7;

foo(x); // This will work
foo(17); // This will also work

关于c++ - 将内置类型变量传递给只有一个类类型参数的 "+"运算符函数时自动类型转换的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59076523/

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