gpt4 book ai didi

c++ - 为什么值会根据我是否在构造函数中打印值而改变?

转载 作者:太空狗 更新时间:2023-10-29 23:49:29 27 4
gpt4 key购买 nike

给定以下 C++ 代码段,行为和输出符合预期:

#include <iostream>
using namespace std;

class A {
public:
int n;
int *p;
A(int n);
};

A::A(int n) {
this->n = n;
this->p = &n;
cout << *(this->p) << endl;
}

int main(int argc, char *argv[]) {
A a(55);
cout << a.n << endl;
cout << *(a.p) << endl;
}

输出是:

55
55
55

但是当构造函数中的打印行被注释掉后,结果是这样的:

#include <iostream>
using namespace std;

class A {
public:
int n;
int *p;
A(int n);
};

A::A(int n) {
this->n = n;
this->p = &n;
// cout << *(this->p) << endl;
}

int main(int argc, char *argv[]) {
A a(55);
cout << a.n << endl;
cout << *(a.p) << endl;
}

输出:

55
32767

我意识到 32767 不是一个任意数,因为它是 (2^15)-1,但是为什么 main 方法的最终 cout 语句打印的值会根据是否构造函数中的那一行是否被注释掉了?

最佳答案

this->p = &n;

n 在这里解析为构造函数的参数。这会将 p 设置为指向构造函数的参数,并且不是 类成员。当构造函数终止时,p 指向一个被销毁的对象(构造函数参数值),解引用p 是未定义的行为。

这是反对对构造函数的参数使用与正在初始化的类成员名称相同的名称的一个论点。很容易无意中创建未定义的行为。

将此更改为:

this->p = &this->n;

得到预期的结果。

关于c++ - 为什么值会根据我是否在构造函数中打印值而改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40711174/

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