C++ 通过成员初始值设定项列表初始化的对象的数据成员的值是多少。具体来说,x和y的值是什么?
当我运行这个程序时,输出是“在A中”和“在显示中”。为什么之后的cout语句不打印?我正在使用成员初始值设定项列表初始化B类对象,因此x和y的值理想情况下应为0。为什么会有这种奇怪的行为C++ 通过成员初始值设定项列表初始化的对象的数据成员的值是多少。具体来说,x和y的值是什么?,c++,C++,当我运行这个程序时,输出是“在A中”和“在显示中”。为什么之后的cout语句不打印?我正在使用成员初始值设定项列表初始化B类对象,因此x和y的值理想情况下应为0。为什么会有这种奇怪的行为 class B { int x, y; public: B(int a) { } void show() //what would this print ? { cout << "In Show"; cout <
class B
{
int x, y;
public:
B(int a)
{
}
void show() //what would this print ?
{
cout << "In Show";
cout << "x = " << x << endl;
cout << "y =" << y;
}
};
class A
{
B *b;
public:
A() : b(0)
{
cout << "In A";
b->show();
}
};
int main()
{
A a;
return 0;
}
B类
{
int x,y;
公众:
B(内部a)
{
}
void show()//这将打印什么?
{
无法您正在使用0
初始化指针b
,然后尝试使用b->show()
取消对该0
的引用
这是一种未定义的行为,任何印刷品都是纯粹的运气
您需要用一个指针来定义一个有效的<代码> b>代码>对象,例如通过分配一个代码<新b>代码>,尽管我高度建议不要使用动态内存作为C++初学者,如果可以避免的话。
考虑到代码的其余部分,您可能只是希望b
具有类型b
,而不是b*
如果你真的想要一个拥有的指针,你更喜欢std::unique\u ptr
而不是B*
此外,您实际上没有在构造函数中将B
s成员初始化为零。调用show
时,这些成员的值将是不确定的。要将它们初始化为零,您需要如下操作:
B(int a) : x(0), y(0)
{
}
或者,如果两者都被初始化为a
,则:
B(int a) : x(a), y(a)
{
}
部分重复?和“我正在使用成员初始值设定项列表初始化B类对象,因此x和y的值理想情况下应为0。”-您在哪里初始化B类
?即使您将使用B
的有效实例的地址初始化B
(可能类似A():B{new B{42}}}
、b.x
和b.y
仍将包含垃圾,因为它们未使用b
s构造函数中的值进行初始化。它们将获得默认初始化,这意味着simpy:不为int
s执行任何操作。如果需要动态内存,他还可以使用共享ptr
和唯一ptr