記事ディレクトリ
コンストラクターについてもう一度話しましょう
前のコンストラクターでは、コンパイラーはコンストラクターを通じてオブジェクトの各メンバーに適切な初期値を与えます。ただし、これは初期化とは言えず、単なる代入と呼ばれます。;初期化は 1 回のみであり、コンストラクター内で無数の代入を行うことができるため;
初期化リスト
初期化リストは、コンストラクターでクラス メンバー変数を初期化するために使用される構文機能です。
初期化リストを使用すると、コンストラクター本体で値を 1 つずつ割り当てる代わりに、オブジェクトの作成時にメンバー変数を指定した値に初期化できます。
文法:初期化リストは、コンストラクター パラメーター リストの後にコロン (:) を付けて続き、コンストラクター本体の前に置かれます。。
初期化リストでは、メンバー変数が続きます 申告順リスト、使用しますコンマ は分離されています。
各メンバー変数の初期化は、メンバー変数名とそれに続く で構成されます。括弧初期値を設定するか、他のコンストラクターを呼び出して完了します。
テスト:
class A
{
private:
int _a;
public:
A(int a = 1)
:_a(a)
{
}
/*A(int* a)
:_a(a)
{
}*/
A(const A& a)
{
_a = a._a;
cout << "A(const A& a)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
};
class Date
{
private:
int _year;
int _month;
int _day;
int& _def;
const int _n;
public:
Date(int year, int month = 1, int day = 1)
:_year(year),
_month(month),
_day(day),
_def(year),
_n(10)
{
}
};
int main()
{
Date d1=2023;
Date d2 = (2023, 11, 4);
Date d3 = {
2023, 11, 4 };
return 0;
}
const メンバーと参照メンバーをテストします。
日付メンバー変数
Date クラスのコンストラクター
はオブジェクトを定義し、それを (2023, 10, 23) に初期化します。
参照変数と定数変数の両方を初期化する必要があります;
標準的な書き方:
メンバー変数にカスタム型がある場合:
メンバーの順番:
初期化リストが完了していない場合:
カスタム型にデフォルトのコンストラクターがない場合:
カスタム タイプのメンバー変数を持つクラス オブジェクトの場合、次のことができます。
暗黙的な型変換
パラメータが複数ある場合
明示的なキーワード
これは、クラスのコンストラクターを変更するために使用される修飾子です。コンストラクターが明示的に変更されると、そのコンストラクターは明示的コンストラクターとしてマークされます。これは、コンストラクターが暗黙的な型変換を実行できないことを意味します。。
静的メンバー
静的クラス メンバー:静的クラスメンバーは、クラスのすべてのオブジェクトによって共有されるメンバー変数です。。静的メンバーとして宣言されると、メモリ内にはコピーが 1 つだけ存在し、オブジェクトがインスタンス化される前にそのコピーが存在します。静的クラスのメンバーはクラスの外で初期化する必要があります。
静的メンバー関数:静的メンバー関数は特定のオブジェクトに対して動作しません。静的メンバー関数には this ポインターがありません。、クラス名を通じて直接アクセスできます。
class A
{
public:
A()
{
count++;
}
A(const A& a1)
{
count++;
}
~A()
{
cout << "~A()" << endl;
}
//调取count成员变量的函数
//静态成员函数,特点:没有this指针
static int GetCount()
{
return count;
}
private:
//声明
static int count;
};
//定义
int A::count = 0;
フレンドクラス
フレンド クラスは、2 つのクラス間の特別な関係を記述します。
クラスが別のクラスのフレンド クラスである場合、そのクラスは他のクラスのプライベート メンバーにアクセスできます。。
クラス宣言で friends キーワードを使用して、フレンド クラスを宣言します。
class Time
{
public:
friend class Date;
//在Time中声明Date类,在Date中可以直接访问Time的成员变量
Time(int hour=1,int mintue=0,int sec=0)
:_hour(hour),
_mintue(mintue),
_sec(sec)
{
}
private:
int _hour;
int _mintue;
int _sec;
};
class Date
{
private:
int _year;
int _month;
int _day;
Time _t;
public:
Date(int year, int month, int day)
:_year(year),
_month(month),
_day(day)
{
}
void SetTime(int hour, int minute, int sec)
{
//可以直接访问私有的成员变量
_t._hour = hour;
_t._mintue = minute;
_t._sec = sec;
}
};
内部クラス
内部クラスは、別のクラスの内部で定義されたクラスです。内部クラスは、プライベート メンバーを含む外部クラスのすべてのメンバーにアクセスできますが、外部クラスは内部クラスのメンバーに直接アクセスできません。。
class A
{
private:
static int k;
int h;
public:
class B//B天生为A的友元
{
public:
void f(const A& a)
{
cout << k << endl;//k是静态成员,可以直接使用
cout << a.h << endl;//h是非静态成员,需要有明确的类对象
}
};
~A()
{
cout << "~A()" << endl;
}
};
int A::k = 1;
int main()
{
A::B b;//B在A类中需要加上作用域符
b.f(A());//A()是匿名对象
return 0;
}
匿名オブジェクト
匿名オブジェクトは、使用中に直接作成される特定の名前のないオブジェクトです。。
これらは通常、メソッドや操作を一時的に実行するため、またはメソッドの戻り値として使用されます。
構文: ClassName();
例:
class Foo()
{
public:
void display()
{
cout<<"this is a Foo"<<endl;
}
}
int main()
{
Foo().display();
}
関数をコピーする際のいくつかの最適化
class A
{
private:
int _a;
public:
A(int a=1)
:_a(a)
{
cout << "A(int a)" << endl;
}
A(const A& a)
{
cout << "A(const A& a)" << endl;
}
A& operator=(const A& a)
{
cout << "A& operator=(const A& a)" << endl;
if (this != &a)
{
_a = a._a;
}
return *this;
}
~A()
{
cout << "~A()" << endl;
}
};
void func1(A aa)
{
cout << "func()" << endl;
}
A func2()
{
A aa;
return aa;
}
A func3(A aa)
{
return aa;
}