類與物件2
一、類的6個預設成員函式
建構函式是特殊的成員函式,他是一種隨物件建立二自動被呼叫的公有成員函式,有且僅在定義物件的時候執行一次,用途是為物件初始化。
特徵:
1.可以初始化私有的成員變數;
2.函式名就是類名;
3.無返回值;
4.可以過載;
5.類中和類外定義均可;
6.如果類中沒有給出建構函式,那麼編譯器就會自動產生一個預設的建構函式(同第一點所說的預設成員函式),但是隻要給出了建構函式,那麼類中就不會自動生成預設建構函式;
7.無參建構函式和全預設值的建構函式都被認為是預設建構函式。
(1)無參建構函式
class Date { public: //無參建構函式 Date() {} private: int _year; int _month; int _day; } int main() { Date d1;//呼叫無參建構函式 return 0; }
(2)帶參建構函式
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
}
int main()
{
Date d2(2018,11,06);//呼叫帶參建構函式
return 0;
}
(3)帶預設引數的建構函式
class Date { public: Date(int year = 2018, int month = 11, int day = 06) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; } int main() { Date d3;//呼叫帶預設引數建構函式 return 0; }
二、解構函式
當一個物件的生命週期結束時,編譯器會自動生成一個這個成員函式,類似於C語言中釋放記憶體的效果,但是解構函式不是刪除物件,只是做刪除物件前的清理工作。另外注意,當未開闢新的記憶體空間時,解構函式基本不用,解構函式在之後動態記憶體開闢時會再次用到。
特徵:
1.類名前加上~就是解構函式;
2.無引數無返回值;
3.一個類有且只有一個(若是未定義,編譯器會自動生成一個預設的解構函式)。
class Date { public: Date(int year = 2018, int month = 11, int day = 06) { _year = year; _month = month; _day = day; } //解構函式 ~Date() {} private: int _year; int _month; int _day; } int main() { Date d3; return 0; }
四、類的拷貝建構函式(複製建構函式)
特徵:
1.函式名同構造函式名,引數不同;
2.建立類物件時用同類物件進行初始化;
3.引數只有一個且必須要用引用傳參,否則會引起無窮遞迴(就是無窮呼叫自己);
4.若未顯示定義,編譯器也會產生一個預設拷貝建構函式,按照成員的宣告次序依次拷貝類成員進行初始化。
class Date
{
public:
Date()
{}
//拷貝建構函式
Date(const Date &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
private:
int _year;
int _month;
int _day;
}
int main()
{
Date d;
return 0;
}
五、操作符過載
特徵:
1.operator+合法的運算子 構成函式名
2.過載以後不能改變優先順序/結合性/運算元個數
class Date
{
public:
Date()
{}
Date(const Date &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
bool operator == (const Date &d)
{
return _year == d._year
&& _month == d._month
&& _day == d._day;
}
private:
int _year;
int _month;
int _day;
}
int main()
{
Date d1;
Date d2 = d1;//呼叫拷貝建構函式
d2 == d1;//呼叫“==”運算子
return 0;
}
還有其他的操作符在部落格主頁會全部整理。
六、類的const成員函式
const修飾類成員:
1.const修飾類的成員變數,該變數必須在建構函式的初始化列表中初始化;
2.const修飾類的成員函式,實際修飾成員函式隱含的this指標,該成員函式中不能對類的任何成員進行修改。
3.在const修飾的成員函式可能需要對類的某個成員變數進行修改,該成員變數只需被mutable關鍵字修飾即可。
class Date
{
public:
void Display()
{
cout << "Display()" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl;
}
void Display() const
{
cout << "Display() const" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
private:
int _year;
int _month;
int _day;
};
void Test()
{
Date d1;
d1.Display();
const Date d2;
d2.Display();
}
int main()
{
Test();
system("pause");
return 0;
}
七、類的取地址操作符過載&const修飾的取地址操作符過載
這兩個預設成員一般不用重新定義,編譯器會預設生成。
只有一種情況下,才會需要過載這兩個操作符,那就是你只想讓別人獲取你指定的內容!