내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
블로거 홈페이지: LiUEEEEE
C++ 열
C 언어 칼럼
데이터 구조 열
정렬 알고리즘 열
Niuke의 고전적인 주제에 관한 칼럼
생성, 소멸, 복사 [클래스 및 객체(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++에서 생성자의 기본 문은 초기화만 합니다. 초기화는 한 번만 초기화할 수 있는 반면 생성자는 멤버 변수에 값을 여러 번 할당할 수 있으므로 할당은 진정한 의미에서 초기화라고 할 수 없습니다.
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;
};
특성:
제 원본 글을 봐주셔서 정말 감사드립니다.
이 기사는 주로 개인 학습 및 지식 공유를 위해 사용됩니다. 실수가 있으면 수정해 주셔서 감사합니다.
인용이 필요하신 경우 주소를 기재해주세요.