为什么这段代码的输出是22

Why is the output of this code is 22?

本文关键字:输出 代码 段代码 为什么      更新时间:2023-10-16
#include <iostream>
using namespace std;
class A {
    int *val;
public:
    A() { val = new int; *val = 0; }
    A(A &a) { val = new int; *val = a.get(); }
    int get() { return ++(*val); }
};
int main() {
    A a,b = a;
    cout << a.get() << b.get();
    return 0;
}

我很难解决这个问题。我对 *val 如何为两个对象提供 22 的输出感到困惑。

b = a使用

a 调用初始值设定项构造函数 (A(A &a)( 来b,它给出abval 1(由于get影响aval以及返回相同的值来初始化bval(。然后在 cout 语句中调用 getabval s 都变为 2,并返回 2。它们彼此相邻打印,因此22.

很简单。您创建*val设置为 0a

然后通过 b = a 创建b,这将调用复制构造器。复制构造函数调用 a.get()

A::get()val指向的值递增 1,然后返回它。所以a *val设置为 1b会返回此值,并将自己的*val设置为 1

然后,使用get()打印两者,在返回之前再次增加每个。所以你从cout << a.get() << b.get();的两个get都得到了2.

我不知道为什么val是一个int*而不仅仅是int它只会混淆代码,并使初学者更难掌握。