gpt4 book ai didi

c++ - 没有重载运算符的转换运算符

转载 作者:行者123 更新时间:2023-12-02 10:03:31 26 4
gpt4 key购买 nike

我正在阅读有关转换运算符的文章,并了解其工作内容。简而言之,当您要从用户定义类型转换为内置类型时,非常需要它们。可能还有更多用途。一个很好的例子是:

class Tiny {
int i;
public:
Tiny (int i) : i(i) {}
operator int() const { return i; }
};

int main() {
Tiny c1 = 2;
int i = c1;
std::cout << i << std::endl;
}

这将输出2。我明白那个。现在,为了增强我的理解,请考虑以下示例:
class Tiny {
public:
class Bad_range {};
Tiny (int i) {
std::cout << "ctor called" << std::endl;
}
operator int() const {
std::cout << "conversion ctor called" << std::endl;
}
};

int main() {
Tiny c1 = 2;
Tiny c2 = 62;
Tiny c3 = c2 - c1;
}

输出:
ctor called
ctor called
conversion ctor called
conversion ctor called
ctor called

我知道两次叫“ctor”是怎么回事。我的意思是Tiny c1 = 2间接意味着Tiny c1 = Tiny(2)。这样很好。我不明白的是为什么“转换ctor被调用”被调用了两次。

同样,还有一个快照,其中包括运算符重载:
class Tiny {
int i;
public:
class Bad_range {};
Tiny (int i) : i(i) {
std::cout << "ctor called" << std::endl;
}
operator int() const {
std::cout << "conversion ctor called" << std::endl;
}
Tiny operator-(Tiny a) {
return this->i - a.i;
}
};

int main() {
Tiny c1 = 2;
Tiny c2 = 62;
Tiny c3 = c2 - c1;
}

输出:
ctor called
ctor called
ctor called

那么,这是否意味着运算符重载比转换运算符具有更高的优先级?

最佳答案

这是因为在第一个示例中未为operator-定义Tiny。带有:

Tiny c3 = c2 - c1; 

为了编译 c1 - c2,编译器必须将两个操作数都转换为 int,然后使用 intoperator-。这是标准转换序列的一部分,过载解析使用此序列来查看 operator-的任何过载是否可以工作。由于没有提供重载,因此编译器会看到它可以将两个值都转换为 int,因此可以调用该重载。

关于c++ - 没有重载运算符的转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61351807/

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