C++ 通过成员初始值设定项列表初始化的对象的数据成员的值是多少。具体来说,x和y的值是什么?

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 <

当我运行这个程序时,输出是“在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 << "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