C++-コンストラクション関数-staticメンバー-C++11-友元

4905 ワード

文書ディレクトリ
  • 1. コンストラクタ
  • 1.1構造関数体付与
  • 1.2初期化リスト
  • explicitキーワード
  • 2. staticメンバー
  • 2.1概念
  • 2.2特性
  • 3. C++11のメンバー初期化新遊び方
  • 4. 友元
  • 4.1概念
  • 4.2友元関数
  • 4.3友元類
  • 5. 内部クラス
  • 5.1概念
  • 5.2特性

  • 1.コンストラクタ
    1.1コンストラクション関数体付与
    class Date
    {
    public:
    	Date(int year, int month, int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    

      上記のコンストラクション関数を呼び出します.オブジェクトにはすでに初期値がありますが、クラスオブジェクトメンバーの初期化とは言えません.コンストラクション関数体に初期値を割り当てるだけです.初期化は1回しか初期化できないため、コンストラクション関数体内で複数回値を割り当てることができます.
    1.2初期化リスト
    Date(int year, int month, int day)
    		: _year(year)
    		, _month(month)
    		, _day(day)
    	{}
    

    注意:1.各メンバー変数は、初期化リストに1回のみ表示されます(初期化は1回のみ)2.クラスには次のメンバーが含まれています.初期化リストの場所に配置して初期化する必要があります(1)参照メンバー変数(2)constメンバー変数(3)カスタムタイプメンバー(このクラスにはデフォルトのコンストラクション関数がありません)
    class A
    {
    public:
    	A(int a)
    		:_a(a)
    	{}
    private:
    	int _a;
    };
    
    class B
    {
    public:
    	B(int a, int ref)
    		:_aobj(a)
    		, _ref(ref)
    		, _n(10)
    	{}
    private:
    	A _aobj;
    	int& _ref;
    	const int _n;
    };
    

    3.初期化リストを使用するかどうかにかかわらず、カスタムタイプのメンバー変数は必ず初期化リストで初期化されるので、できるだけ初期化リストを使用して初期化します.4.クラス内のメンバー変数の宣言順序は、初期化リスト内の優先順位に関係なく、初期化リスト内の初期化順序です.
    explicitキーワード
    構造関数は、オブジェクトを構築および初期化するだけでなく、単一のパラメータの構造関数に対してもタイプ変換の役割を果たすことができます.構造関数をexplicitで修飾すると、単一構造関数の暗黙的な変換が禁止されます.
    class Date
    {
    public:
    	Date(int year)
    		:_year(year)
    	{}
    
    	//       
    	/*explicit Date(int year)
    		:_year(year)
    	{}*/
    
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    
    void TestDate()
    {
    	Date d1(2018);
    	d1 = 2019;
    }
    

    2.staticメンバー
    2.1概念
      staticと宣言されたクラスメンバーをクラスの静的メンバーと呼び、staticで修飾されたメンバー変数を静的メンバー変数と呼び、staticで修飾されたメンバー関数を静的メンバー関数と呼び、静的メンバー変数は必ずクラス外で初期化する.
    2.2特性
      1.静的メンバーはすべてのクラスオブジェクトで共有され、特定のインスタンス 2に属しません.静的メンバー変数はクラス外で定義する必要があります.定義時にstaticキーワード  3を追加しません.クラスの静的メンバーは、静的メンバーまたはオブジェクトとして使用できます.静的メンバーは、静的メンバー関数には非表示のthisポインタがないため、非静的メンバー 5にアクセスできません.静的メンバーはクラスの一般メンバーと同様にpublic,protected,privateの3つのアクセスレベルもあり、戻り値もあります.
    質問:1.静的メンバー非静的メンバー関数を呼び出すことができますか?静的メンバー関数に隠されていないthisポインタは、すべてのクラスオブジェクトに共通の1部にすぎません.非静的メンバー関数はクラスの静的メンバー関数を呼び出すことができますか?よろしい
    3.C++11のメンバーが新しい遊び方を初期化する
     C++11は、非静的メンバー変数が宣言時に初期化されることをサポートしますが、ここでは初期化ではなく、宣言されたメンバー変数のデフォルト値であることに注意してください.
    class B
    {
    public:
    	B(int b = 0)
    		:_b(b)
    	{}
    	int _b
    };
    

    4.友元
    4.1概念
      友元は友元関数と友元類に分けられ、友元はパッケージを突破する方法を提供し、時には便利を提供することができるが、友元は結合度を増加させ、パッケージを破壊するので、多く使うべきではない.
    4.2友元関数
    質問:operator<>を再ロードしてみましょう.
    class Date
    {
    	friend ostream& operator<>(istream& _cin, Date& d);
    public:
    	Date(int year, int month, int day)
    		: _year(year)
    		, _month(month)
    		, _day(day)
    	{}
    
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    
    ostream& operator<>(istream& _cin, Date& d)
    {
    	_cin >> d._year;
    	_cin >> d._month;
    	_cin >> d._day;
    
    	return _cin;
    }
    

    説明:  1.友元関数はクラスのプライベートおよび保護メンバーにアクセスできますが、クラスのメンバー関数 2ではありません.友元関数はconstで友元関数は、クラスアクセス制限子に制限されずに定義された任意の場所で宣言できます.1つの関数は、複数のクラスの友元関数  5であってもよい.友元関数の呼び出しは普通の関数の呼び出しと原理と同じです
    4.3友元類
      友元クラスのすべてのメンバー関数は、別のクラスの友元関数であり、別のクラスの非公有メンバーにアクセスできます.  友元関係は一方向であり,交換性を持たない.AクラスでBクラスがその友元クラスであると宣言すると、BクラスではAクラスのプライベートメンバー変数に直接アクセスできますが、AクラスではBクラスのプライベートメンバー変数にアクセスできません.  友元関係は伝達性を持たない.BがAの友元、CがBの友元であれば、C時のAの友元は説明できません.
    #include 
    using namespace std;
    
    //    
    class Date;
    
    class Time
    {
    	friend class Date;
    public:
    	Time()
    	{}
    	Time(int hour, int minute, int second)
    		: _hour(hour)
    		, _minute(minute)
    		, _second(second)
    	{}
    
    private:
    	int _hour;
    	int _minute;
    	int _second;
    };
    
    class Date
    {
    public:
    	Date(int year = 1900, int month = 1, int day = 1)
    		: _year(year)
    		, _month(month)
    		, _day(day)
    	{}
    
    	void SetTimeOfDate(int hour, int minute, int second)
    	{
    		//              
    		_t._hour = hour;
    		_t._minute = minute;
    		_t._second = second;
    	}
    
    private:
    	int _year;
    	int _month;
    	int _day;
    	Time _t;
    };
    

    5.内部クラス
    5.1概念
      あるクラスの定義が別のクラスの内部にある場合、この内部のクラスを内部クラスと呼びます.このとき、この内部クラスは独立したクラスで、外部クラスに属していません.外部クラスのオブジェクトを通じて内部クラスを呼び出すことはできません.外部クラスは内部クラスに対して何のアクセス権もありません.注意:  内部クラスは外部クラスの友元クラスであり、友元クラスの定義に注意してください.内部クラスは外部クラスのオブジェクトパラメータから外部クラスのすべてのメンバーにアクセスできますが、外部クラスは内部クラスの友元ではありません.
    5.2特性
      1.内部クラスは、外部クラスのpublic、protected、privateで定義できます.  2.注意:内部クラスは、外部クラスのstatic、メンバーを列挙し、外部クラスのオブジェクト/クラス名を必要としません.  3.sizeof(外部クラス)=外部クラスであり、内部クラスとは何の関係もありません.
    #include 
    using namespace std;
    
    class A
    {
    private:
    	static int k;
    	int h;
    
    public:
    	class B
    	{
    	public:
    		void foo(const A& a)
    		{
    			cout << k << endl;
    			cout << a.h << endl;
    		}
    	};
    };
    
    int A::k = 1;
    
    int main()
    {
    	A::B b;
    	b.foo(A());
    
    	return 0;
    }