3

你可能会觉得代码很长,我写了很多东西,但相信我,这很简单。

为了理解这一点,我在 stack-overflow 上引用了这两个答案。 后 1后 2

代码

#include <iostream>

class A
        {
        public:
            int k1=3;
            float f1=34.20;
            char ch1='a';
            std::string str1="bonaparte";

            void display()
            {
                std::cout<<k1<<" "<<f1<<" "<<ch1<<" "<<str1<<" xx\n";
            }

        };

class B
{
    public:
        int k2;
        float f2;
        char ch2;
        std::string str2;

        void display()
        {
            std::cout<<k2<<" "<<f2<<" "<<ch2<<" "<<str2<<" xx\n";
        }

};

A a1;
B b1;

A *p1=new A;
B *q1=new B;
int main()
{
    A a2, a3{};
    B b2, b3{};

    A *p2=new A;
    A *p3=new A{};
    A *p4=new A();

    B *q2=new B;
    B *q3=new B{};
    B *q4=new B();

    a1.display();
    a2.display();
    a3.display();
    p1->display();
    p2->display();
    p3->display();
    p4->display();

    std::cout<<"\n\n";

    b1.display();
    b2.display();
    b3.display();
    q1->display();
    q2->display();
    q3->display();
    q4->display();


}

输出

3 34.2 a bonaparte xx
3 34.2 a bonaparte xx
3 34.2 a bonaparte xx
3 34.2 a bonaparte xx
3 34.2 a bonaparte xx
3 34.2 a bonaparte xx
3 34.2 a bonaparte xx


0 0    xx
13965136 0 ╠  xx
0 0    xx
38872208 0 p  xx
38872208 0 p  xx
0 0    xx
0 0    xx

B类

b1是值初始化精确零初始化。

b2是默认初始化意味着没有初始化。

b3是大括号初始化意味着值初始化导致零初始化。

我无法创建b4()类似q4(不完全类似,但你知道我的意思),因为它引导函数定义而不是对象声明(最令人烦恼的解析)

我认为q1应该初始化值,但在看到输出后它与我的想法不符。

q2是默认初始化意味着没有初始化。

q3是大括号初始化意味着值初始化导致零初始化。

q4调用构造函数,但没有用户定义的构造函数,所以它应该默认初始化意味着没有初始化。

我知道q1, q2, q3,q4是指针,但为了简单起见,我将上述语言用于 ex。q3是大括号初始化的。但我想你知道我的意思。

我对b1,b2b3看法被证明是正确的,所以我对此没有任何疑问,这可能只是巧合,如果我错了,请纠正我。

关于q1, q2, q3,q4

我认为b1我认为它也应该适用,q1但它不会发生,所以请解释一下。

关于q2我认为匹配的内容,所以没问题,但如果我错了,请纠正我。

现在与q3&混淆了q4。我认为两者都在呼吁构造函数,但我不确定。我假设两者都调用构造函数,但我们没有用户定义的构造函数,所以它应该默认初始化意味着未初始化,不是吗?那么为什么两者都被精确地初始化为零初始化。

A级

因此,如果我们进行类内初始化,无论我们在哪里声明对象,它将使用我们提供的内容进行初始化,我觉得这是正确的,但只是想确认一下,如果您想告诉我更多关于这一点的信息,请添加。

4

0 回答 0