細部
1.コンストラクタの側面
初期リスト
コロンで始まるでコンストラクタでは、データ・メンバーのカンマ区切りリストが続き、メンバ変数は、各括弧の後に、内部ブラケット構成用いる同様のコピーメンバ変数を初期化するために。
class Date
{
public:
Date(int year = 2019, int month = 10, int day = 19)//构造函数
:_year(year)//初始化列表
,_month(month)
, _day(day)
{
}
Date(Date& d)//拷贝构造函数
:_year(d._year)//初始化列表
,_month(d._month)
,_day(d._day)
{
}
private:
int _year;
int _month;
int _day;
};
注意:
- 各メンバ変数の初期化リストは一度だけ開始することができます。
- クラスは、初期化リストで初期化されなければならないメンバーについては含まれています。
constメンバ変数は、修飾
の参照型メンバ変数
クラスタイプ(カスタムタイプ)メンバ変数(カスタムクラスとない既定のコンストラクタ)を
、実施例1
class B
{
public:
private:
int& _ref;
const int _b;
};
int main()
{
B b;
return 0;
}
直接目的は、Bをインスタンス化されると、それは?間違いを報告した
B&タイプが存在するか、直接エラーを報告するときときconstメンバ変数。
例2
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
private:
A _ca;
};
int main()
{
B b;
return 0;
}
それはまた、エラーに登場:
ときにオブジェクトクラスB実施例B、場合、オブジェクトBは、オブジェクトがインスタンス化されるときその結果、クラスAに存在するので_aコールにおけるオブジェクトBのための適切なコンストラクタにも発生することができませんこのタイプのエラー。
ソリューションは、
使用初期化リスト、これらには、オブジェクトがインスタンス化されるときに発生正しくインスタンス化された3種類を解決することはできません。
CONST:非修正の変数、あなたが初期化されなければならない作成する際に、
&タイプ:あなたは、参照型の変数を基準にする必要がありますそうでなければ方法を作成しない場合は作成します。
カスタムタイプ:なしカスタムタイプは、カスタム型オブジェクトの適切なコンストラクタ呼び出しを呼び出し可能なない場合はインスタンス化することはできません。
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
B(A ca, int ref, int b)//使用初始化列表
:_ca(ca)
,_ref(ref)
,_b(b)
{}
private:
A _ca;
int& _ref;
const int _b;
};
int main()
{
B b(1, 2, 3);//传递列表中的参数
return 0;
}
最初のカスタムクラスが一緒に呼び出し、初期化リストのconst、INT&初期設定では、構築することが_ca。
ご注意ください
- 初期化する初期化リストを使用してみてくださいメンバ変数を初期化するタイプ、使用初期化リストをカスタマイズするため、。
- メンバ変数に宣言のためにクラスのために初期化リストで初期化される初期化リスト内の順序に関係なく、。
class B
{
public:
B(int a, int b)
: _b(b)//先初始化成员变量_a
, _a(a)//与所放置位置无关
{
}
private:
int _a;
int _b;
};
建設無名のオブジェクト
唯一1つのパラメータがシンボルによって直接割り当てることができる場合にインスタンス化オブジェクト=。
class B
{
public:
B(int a) :_a(a)
{
}
private:
int _a;
};
int main()
{
B b1(1);
b1 = 20;
return 0;
}
B1(1)、1時間、B1 _a最初のメンバ変数、
B1 = 20が、直下型B 20は、無名オブジェクトに構成された B1の割り当てを実行します。
2.静的メンバー
静的メンバ変数
- 静的メンバ変数の初期化では、初期化リスト内の位置に配置することができません。外のクラスは、初期化する必要があります。
- 静的メンバ変数は、クラス外部メンバ変数として考えることができ、すべてのオブジェクトは、静的メンバ変数を共有します。
class B
{
public:
B()
{
}
private:
static int _s;
};
int B::_s = 10;// 在类外进行初始化静态成员变量
int main()
{
B b;
return 0;
}
静的メンバ関数
- スタティックメンバ関数は、クラスの外側は、クラスで達成することができ、達成することができ、クラス内で宣言しました。
class B
{
public:
static void Func1();
static void Func2()
{
cout<<"static Func2"<<endl;
}
private:
int _a;
};
void B::Fun1c1()//在类外实现也和静态成员变量相同,
{ //必须的加上作用域限定符B
cout << "static Func1" << endl;
}
int main()
{
B b;
b.Func1();
b.Func2();
}
- 静的メンバ関数は、このポインタが含まれていません
class B
{
public:
static void Func()
{
_a = 10;//在类内静态成员函数调用this指针中的变量_a
}
private:
int _a;
};
int main()
{
B b;
b.Func();
}