gpt4 book ai didi

C++ 运算符重载和参数化构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:01 28 4
gpt4 key购买 nike

为什么下面的 C++ 程序输出“ABaBbAc”?

#include "stdafx.h"
#include <iostream>

using namespace std;

class A {
public:
int i;
A(int j=0):i(j)
{
cout<<"A";
}
operator int()
{
cout<<"a";
return 2;
}
};

class B {
public:
B(int j=1):i(j){
cout<<"B";
}
operator int() {
cout<<"b";
return 3;
}
int i;
};

int operator+(const A&a, const B&b){
cout<<"C";
return a.i + b.i;
}

int main()
{
A a;
B b;

int i = (A)b + (B)a;
return 0;
}

最佳答案

首先,ab 是默认构造的(按此顺序),这导致AB 被打印到标准输出。

在此之后,程序的输出可能与您正在观察的输出不同(或者可能正是您正在观察的输出 - 请继续阅读)。

这是因为operator + 的操作数不需要按确定的顺序求值。它们仅被授予在调用 operator + 之前进行评估(请参阅 C++11 标准的第 1.9/15 段)。

所以这个表达式:

(A)b

在给定 B 类型的对象的情况下,将导致构造 A 类型的临时对象。这怎么可能?好吧,A 有一个接受 int 的构造函数,而 B 有一个用户定义的到 int 的转换。

因此用户定义的从bint 的转换(1) 负责打印a b。然后,根据生成的 int (2) 临时构造 A 负责打印 A

对称地,表达式:

(B)a

将导致构造 B 类型的临时对象,该对象是根据用户定义的将 a 转换为 int 的结果构造的>。这个转换(3)负责打印a,而构建B临时(4)负责打印B

最终,表达式 (A)b(B)a 的求值结果的两个临时值被用作 operator +< 的参数 (5),它负责打印一个C

现在 C++ 标准只规定:

  • (1)-(4) 必须在 (5) 之前评估
  • (1) 必须在 (2) 之前评估
  • (3) 必须在 (4) 之前评估

除此之外,评估的顺序是未指定的。这意味着输出必须是这样的:

AB????C

其中问号应替换为 (1)、(2)、(3) 和 (4) 的输出的可接受排列,以满足上面指定的约束。

关于C++ 运算符重载和参数化构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17070947/

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