私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
ブロガーのホームページ: LiUEEEEE
C++ 列
C言語コラム
データ構造列
ソートアルゴリズム列
新受の定番トピックスコラム
構築、破壊、コピー【クラスとオブジェクト(その2)】
クラスのコンストラクターについては、「日付クラス」を例に説明します。初期化メソッドは次のとおりです。
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
上記のコードに示されているように、C++ をさらに学習しないと、ユーザーは通常、コンストラクター内のコードがクラス メンバー変数の初期化であると考えるでしょう。しかし、実際はまったく逆で、C++ ではコンストラクターのメイン ステートメントは初期化のみを行います。コンストラクターはメンバー変数に値を複数回代入できるのに対し、初期化は 1 回しか初期化できないため、代入は本当の意味での初期化とは言えません。
Date(int year, int month, int day)
{
_year = year;
_year += 1;
}
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
注意しなければならないことは次のとおりです。
class A
{
public:
A(int n)
:_a2(n)
,_a1(_a2)
{}
void Print()
{
cout << "_a1 = " << _a1 << endl;
cout << "_a2 = " << _a2 << endl;
}
private:
int _a1;
int _a2;
};
int main()
{
A aa(100);
aa.Print();
return 0;
}
上図のように初期化すると期待と異なる結果が得られるため、使用する場合にはそのような操作は避けてください。
class Date
{
public:
Date(int year)
: _year(year)
{}
Date& operator=(const Date& d)
{
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
private:
int _year;
int _month;
int _day;
};
class Date
{
public:
Date(int year, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
Date& operator=(const Date& d)
{
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
private:
int _year;
int _month;
int _day;
};
値を渡して代入する場合は、たとえば次のようになります。
Date date(2024);
コンパイラ レベルでは、2024 は作成されたクラス オブジェクトに直接割り当てられませんが、暗黙的な変換を通じて 2024 が一時クラス オブジェクトに変換され、そのようなオブジェクトを通じて初期化が必要なクラス オブジェクトに割り当てられます。が必要です。 初期化されたクラス オブジェクトは A で、一時クラス オブジェクトは B です。
Date A(2024);
等价于
Date A = B//B的值为2024
explicit Date(int year)
: _year(year)
{}
class Date
{
public:
Date(int year, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
static int _i;
};
int Date::_i = 1;
フレンドはフレンド機能とフレンドクラスに分かれています。
class Date
{
friend void Print(Date& d);
public:
Date(int year = 1, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
void Print(Date& d)
{
cout << d._year << " " << d._month << " " << d._day <<endl;
}
class Time
{
friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类
//中的私有成员变量
public:
Time(int hour = 0, int minute = 0, int second = 0)
: _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;
};
特性:
私のオリジナル記事をご覧いただきまして誠にありがとうございます。
この記事は主に個人的な学習と知識の共有に使用されます。学習には長い時間がかかります。間違いがある場合は、修正していただきありがとうございます。
引用する場合はアドレスを明記してください。