1、什麼是面向對象?
面向對象程序設計
概念:(Object Oriented Programming,縮寫:OOP)是一種程序設計範型,同時也是一種程序開發的方法。 對象指的是類的實例,將對象作爲程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性。
C++不是純面嚮對象語言,而是基於面向對象的語言 (ps:因爲它包含C的部分,C是面向過程)
面向對象的三大特性: 封裝、繼承、多態
2、類的大小?爲什麼要內存對齊?內存對齊的計算?空類的計算
1) 每個對象的大小爲類中所有成員變量的大小之和,當然這裏也遵循內存對齊原則。
內存對齊原則請查看:http://blog.csdn.net/adzn1/article/details/78619851
2)內存對齊是爲了提高程序運行速度(浪費空間換時間)
3)空類的大小爲1
3、隱含的this指針
4、四個默認成員函數詳解
1、構造函數:
成員變量爲私有的,要對它們進行初始化,必須用一個公有成員函數來進行。同時這個函數應該有且僅在頂yi時自動執行一次。
特點:
1)函數名與類名相同;
2)無返回值;
3)對象構造時系統自動調用對應的構造函數
4)可以重載
5)可在類內定義,也可在類外定義
6)若在類中沒有定義構造函數,則c++編譯器自動產生一個缺省的構造函數,定義了系統就不會自動產生。
7)無參的構造函數和全缺省值的構造函數都認爲是缺省構造函數,並且缺省的構造函數只能有一個。
無參構造函數&帶參的構造函數
class Date
{
public :
// 1.無參構造函數
Date ()
{}
// 2.帶參構造函數
Date (int year, int month , int day ) {
_year = year ;
_month = month ;
_day = day ;
}
private :
int _year ;
int _month ;
int _day ;
};
void TestDate1 ()
{
Date d1 ; // 調用無參構造函數 Date d2(2015, 1, 1); // 調用帶參的構造函數
}
帶缺省參數的構造函數
class Date
{
public :
// 3.缺省參數的構造函數
Date (int year = 2000, int month = 1, int day = 1)
{
_year = year ;
_month = month ;
_day = day ;
}
2、拷貝構造函數
創建對象時使用同類來進行初始化,這時所用的構造函數稱爲拷貝構造函數,拷貝構造函數是特殊的構造函數。
特徵:
1)拷貝構造函數其實是一個構造函數的重載。
2)拷貝構造函數的參數必須使用引用傳參,使用傳值方式會引發無窮遞歸引用。
3)若未寫,系統會默認缺省的拷貝構造函數,依次拷貝類成員進行初始化。
class Date
{
public :
Date()
{}
// 拷貝構造函數
Date (const Date& d)
{
_year = d ._year;
_month = d ._month;
_day = d ._day;
}
private :
int _year ;
int _month ;
int _day ;
};
void TestDate1 ()
{
Date d1 ;// 下面兩種用法都是調用拷貝構造函數,是等價的。
Date d2 (d1); // 調用拷貝構造函數
Date d3 = d1; // 調用拷貝構造函數
}
3、析構函數:
當一個對象的生命週期結束時,C++編譯系統會自動調用一個成員函數,這個特殊的成員函數即析構函數
特徵:
1、析構函數在類名加上字符~;
2、析構函數無參數無返回值。
3、一個類有且只有一個析構函數,若未顯示,系統會自動生成缺省的析構函數
4、對象生命週期結束時,c++編譯系統自動調用析構函數
5、注意析構函數體內並不是刪除對象,而是做一些清理工作
先構造後析構,後析構先構造
class Date
{
public : // 析構函數
~Date()
{}
private :
int _year ;
int _month ;
int _day ;
};
EXP0
class Array
{
public :
Array (int size)
{
_ptr = (int *)malloc( size*sizeof (int));
}
// 這裏的析構函數需要完成清(shi)理(fang)工(kong)作(jian)。
~ Array ()
{
if (_ptr )
{
free(_ptr );
_ptr = 0;
}
}
private :
int* _ptr ;
};
4、運算符重載:
爲了增強程序的可讀性,C++支持運算符重載。
運算符重載特徵:
1. operator+ 合法的運算符 構成函數名(重載<運算符的函數名:operator< )。
2. 重載運算符以後,不能改變運算符的優先級/結合性/操作數個數。
筆試題考點 5個C++不能重載的運算符:
.*/::/sizeof/?:/.
【賦值運算符重載】
拷貝構造函數是創建的對象,使用一個已有對象來初始化這個準備創建的對象。 賦值運算符的重載是對一個已存在的對象進行拷貝賦值。
class Date
{
public :
Date()
{}
// 拷貝構造函數
Date (const Date& d)
_year(d._year)
_month(d._month)
_day(d._day)
{}
// 賦值操作符的重載
// 1.思考爲什麼operator=賦值函數需要一個 Date&的返回值,使用void做返回值可以嗎?請驗證
Date& operator = (const Date& d)
{
// 2.這裏的if條件判斷是在檢查什麼?
if (this != &d)
{
this->_year = d. _year;
this->_month = d. _month;
this->_day = d. _day;
}
return *this ;
} private:
int _year ;
int _month ;
int _day ;
};
void Test ()
{
Date d1 ;
Date d2 = d1; // 調用拷貝構造函數
Date d3 ;
d3 = d1 ; // 調用賦值運算符的重載
}