初級 C++ -- クラスとオブジェクト (3) (図解)

コンストラクターについてもう一度話しましょう

前のコンストラクターでは、コンパイラーはコンストラクターを通じてオブジェクトの各メンバーに適切な初期値を与えます。ただし、これは初期化とは言えず、単なる代入と呼ばれます。;初期化は 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;
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m0_74068921/article/details/134353471