C++ 关于作为类成员的对象

C++ 关于作为类成员的对象,c++,constructor,C++,Constructor,我有以下代码片段: class A{ int i; public: A(int x): i(x) {} int get_i() { return i; } }; class B{ A a; int j; public: B(int x, A y) { j = x; a = y; } // <-- int get_j() { return j; } }; A类{ int i; 公共:A(int x):i(x){} int get_i

我有以下代码片段:

class A{
    int i;
    public: A(int x): i(x) {}
    int get_i() { return i; }
};

class B{
    A a;
    int j;
public:
    B(int x, A y) { j = x; a = y; } // <--
    int get_j() { return j; }
};
A类{
int i;
公共:A(int x):i(x){}
int get_i(){return i;}
};
B类{
A A;
int j;
公众:

B(int x,A y){j=x;A=y;}/
A
没有默认构造函数,只有一个参数化构造函数,因此需要使用成员初始化列表语法构造
B

class B{
    A a;
    int j;
public:
    B(int x, A y) : j(x), a(y) {}
    int get_j(){return j;}
};

A
没有默认构造函数,只有一个参数化构造函数,因此需要使用成员初始化列表语法构造
B

class B{
    A a;
    int j;
public:
    B(int x, A y) : j(x), a(y) {}
    int get_j(){return j;}
};

构造函数在执行其主体之前运行其主体

因此,当构造函数的
{j=x;a=y;}
部分有机会执行时,数据成员
a
应该已经使用其默认构造函数进行了初始化。然后,在构造函数的主体内,您
a=y
语句中重新为其赋值

您可以(并且通常应该)使用成员初始值设定项列表使用所建议的解决方案。但是,您还可以从以下方面获益:将(因为编译器不会为您合成)引入
A
类也是一个有效的选项(取决于其他因素)


构造函数在执行其主体之前运行其主体

因此,当构造函数的
{j=x;a=y;}
部分有机会执行时,数据成员
a
应该已经使用其默认构造函数进行了初始化。然后,在构造函数的主体内,您
a=y
语句中重新为其赋值

您可以(并且通常应该)使用成员初始值设定项列表使用所建议的解决方案。但是,您还可以从以下方面获益:将(因为编译器不会为您合成)引入
A
类也是一个有效的选项(取决于其他因素)


如果你把C++ C++打开到讲述构造函数的章节,解释构造函数的初始化部分是什么,以及它是什么,你会找到你所问的所有问题的答案。它可能会有一个与你的几乎相同的例子。@ SavaVavikk我没有C++教科书:(C++是目前使用最复杂的通用编程语言,不可能从YouTube视频或随机网站中学习和理解C++。任何小丑都可以创建一个可以说任何东西的网站,或者上传一个视频到YouTube。但是只有一个质量好的、被编辑的C++教科书将提供学习C++的指南。有条理、有条理的方式,充分地解释它的基本原理,并有有用的实践问题,回答问题。这个问题的答案是正确的,但是我相信你会有困难理解它,没有教科书。如果你打开C++教科书到章节,谈论构造函数,解释什么是CON。结构的初始化部分是,并且它是什么,你会找到你所问的所有问题的答案。它可能会有一个与你的几乎相同的例子。@ SAMVARSHIVCHK我没有C++教科书:(C++是目前使用最复杂的通用编程语言,不可能从YouTube视频或随机网站中学习和理解C++。任何小丑都可以创建一个可以说任何东西的网站,或者上传一个视频到YouTube。但是只有一个质量好的、被编辑的C++教科书将提供学习C++的指南。以一种有组织、有条理的方式,充分解释它的所有基本原理,并有有用的实践问题和答案。这个问题的答案是正确的,但我相信你在没有教科书的情况下理解它会有困难。但是为什么非参数构造函数需要a?你能告诉我一个更一般的答案吗规则?我的意思是,我知道在继承中,如果初始值设定项列表中缺少构造函数,则默认值(非参数)基类的构造函数将被调用,这是相同的规则吗?@alexMcKenzie这里需要注意的重要一点是,您不能在构造函数体中初始化
A
。它是在构造函数之前初始化的runs@463035818_is_not_a_number是正确的。基本上在您的代码中第一个(不存在)
A
的默认构造函数在
B
的构造函数体之前被调用,然后您尝试将assign
A
复制到
B
构造函数体中。@alexMcKenzie是的。您没有提供初始化器的所有成员都进行了值初始化。但是为什么为A调用非参数构造函数?您不能吗请告诉我一个更一般的规则?我的意思是,我知道在继承中,如果初始值设定项列表中缺少构造函数,则默认值(非参数)基类的构造函数将被调用,这是相同的规则吗?@alexMcKenzie这里需要注意的重要一点是,您不能在构造函数体中初始化
A
。它是在构造函数之前初始化的runs@463035818_is_not_a_number是正确的。基本上在您的代码中第一个(不存在)
A
的默认构造函数在
B
的构造函数体之前被调用,然后您尝试将assign
A
复制到
B
构造函数体中。@alexMcKenzie Yes。您未提供初始化器的所有成员都进行了值初始化。