你可能会觉得代码很长,我写了很多东西,但相信我,这很简单。
为了理解这一点,我在 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
,b2
的b3
看法被证明是正确的,所以我对此没有任何疑问,这可能只是巧合,如果我错了,请纠正我。
关于q1
, q2
, q3
,q4
我认为b1
我认为它也应该适用,q1
但它不会发生,所以请解释一下。
关于q2
我认为匹配的内容,所以没问题,但如果我错了,请纠正我。
现在与q3
&混淆了q4
。我认为两者都在呼吁构造函数,但我不确定。我假设两者都调用构造函数,但我们没有用户定义的构造函数,所以它应该默认初始化意味着未初始化,不是吗?那么为什么两者都被精确地初始化为零初始化。
A级
因此,如果我们进行类内初始化,无论我们在哪里声明对象,它将使用我们提供的内容进行初始化,我觉得这是正确的,但只是想确认一下,如果您想告诉我更多关于这一点的信息,请添加。