その理由が表示されます(1)オブジェクトの初期化リスト
1.あなたはこの操作を行う必要があります。
私たちはクラスのメンバを持っている場合は、それ自体は、クラスまたは構造体であるが、それは、このコンストラクタの引数の唯一のメンバー、ないデフォルトコンストラクタ()を持っています。このクラスの初期化のメンバーであるために、この時間は、それは初期化リストが存在しない場合は、その後、彼は、それがエラーになります最初のステップを完了することができません、クラスメンバーのパラメータを持つコンストラクタを呼び出す必要があります。
2クラスのメンバと、オブジェクトのconst修飾はCONST INT mの割り当てに、初期化されなければならない場合。彼らのために行うには、クラスのメンバは、constオブジェクトが含まれている、または引用符があるときに、2つのオブジェクトが文の直後に初期化するので、彼らは、メンバー初期化リストで初期化する必要がありますが、コンストラクタ内のとき割り当てが、これは許可されていません。
メンバ変数に提供(2)C ++初期化リストが初期化され、文法規則:
Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)
{
// some other assignment operation
}
(3)注意事項概念のこと
初期化:初期オブジェクトが作成されます
割り当て:オブジェクトはすでに存在して割り当てられ、
(4)対応するパラメータリストコンストラクタの初期化順序:
配列に関連する初期化シーケンスと宣言メンバー変数は、関係なく、初期リストの順序の、コンストラクタ関数本体の前に実行のリストを初期化します。
コンストラクタ反対実行順序及び実行デストラクタ(5)
コードは次のようになり、真剣に出力を見てみましょう。
#include<iostream>
using namespace std;
class A
{
public:
A(int _a)
{
a = _a;
cout<<"构造函数"<<" a "<<a<<endl;
}
~A()
{
cout<<"析构函数"<<" a "<<a<<endl;
}
void print()
{
cout << a << endl;
}
protected:
private:
int a;
};
//1 构造函数的初始化列表 解决: 在B类中 组合了一个 A类对象 (A类设计了构造函数)
//根据构造函数的调用规则 设计A的构造函数, 必须要用;没有机会初始化A
//新的语法 Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)
class B
{
public:
B(int _b1, int _b2):a1(1),a2(2),c(0)
{
}
B(int _b1, int _b2, int m, int n):a1(m), a2(n), c(0)
{
b1 = _b1;
b2 = _b2;
cout<<"B的构造函数"<<endl;
}
~B() //c++中的析构函数,没有返回值,不允许加任何参数,故不能重载
{
cout << "B的析构函数" << endl;
}
private:
int b1;
int b2;
A a2;
A a1;
const int c;
};
//2 在初始化参数列表中,先执行初始化参数列表的构造函数,再执行下面构造函数的部分
//如果组合对象有多个,按照定义顺序,而不是按照初始化列表的顺序
//析构函数:和执行构造函数的顺序正好相反
//3 被组合对象的构造顺序,与定义顺序有关,与初始化列表的顺序没有关系
//4 初始化列表用来给const属性赋值
void obj10play()
{
//A a1(10);
//B objB(1,2);
// 1 参数传递
B objB2(1, 2, 3, 4);
//2 调用顺序
}
int main(int argc, char* argv[])
{
obj10play();
system("pause");
}
/**
输出:
构造函数 a 4
构造函数 a 3
B的构造函数
B的构造函数
析构函数 a 3
析构函数 a 4
请按任意键继续....
*/