我正在尝试学习c ++中的面向对象的编程,并且无法理解为什么以下代码无法打印出嗨:
#include <iostream>
class test{
double* x;
double y=5;
public:
void printhi(){
*x=y;
std::cout<<"hi";
}
};
int main(){
test a;
a.printhi();
return 1;
}
此代码没有给我任何输出。如果仅删除指针分配,则std::out<<"hi";
运行良好。为什么?在此分配指针对计算机意味着什么?
您的代码具有未定义的行为。
*x=y;
您正在取消引用尚未初始化的指针。在取消引用之前,指针必须指向某物。
成员x
没有初始化程序。因此,如果该类是默认初始化的,它将是默认初始化的。默认的初始化指针具有不确定的值。
尝试通过不确定的指针分配不存在的对象,或者甚至读取不确定的值具有未定义的行为。
在那里分配指针对计算机意味着什么?
您尚未分配指针。您已通过指针进行了间接操作,并分配了指向的对象。除了没有指针指向以外,因为指针具有不确定的值。该程序的行为是不确定的。
如果我只是删除指针分配,则std :: out <
如果删除未定义的行为,则该程序的行为将与您期望的一样。
我以为* x = y和x =&y是相同的分配
完全没有。首先,通过指针x
进行分配,并将指向的对象修改为与对象y
相同的值。第二个修改指针x
指向对象y
。
但x具有无法确定的不确定值
可以指定一个不确定的值。赋值后,该值将不再是不确定的。这就是x=&y
具有明确定义的行为的原因。它分配指针。
也就是说,将对象指针成员指向另一个成员的有用性尚不明确。
您需要在对象的构造函数中初始化x
test::test()
{
x = new double;
}
此外,由于您要声明原始指针(在大多数情况下不建议使用,所以不要忘记删除它,以免破坏内存以免发生任何内存泄漏:
test::~test()
{
delete x;
}
所以您的课程至少应该有:
class test {
double* x;
double y = 5;
public:
test();
~test();
void printhi() {
*x = y;
std::cout << "hi";
}
};
我已通过将* x = y更改为x =&y来解决此问题。为什么这样做更好?我认为这些是2个等效的作业。
它们是完全不同的两件事。
x = &y
使指针x
指向变量y
。没关系。太好了。
*x = y
将y
的值分配给“ x
指向的任何内容”。除了x
指向什么都没有,因为您从未让它这样做。您可以为它动态地分配一个double
指向它,然后分配给它,但是尚不清楚这是您想要做的。
不幸的是,您没有告诉我们您要做什么,所以我们不能说哪种是适合您的解决方案。
就像您在代码中一样,未定义行为的一个可能结果是,其他似乎理智的代码突然“不起作用”。您正在写“随机”内存,应该习惯于不要奇怪,这会导致奇怪的发生(例如cout
没有结果)。