類的基本建構式
QQ:2965614766-----初級總結,哪里不對歡迎糾正
| 默認建構式 | Human(); |
|---|---|
| 自定義建構式 | Human(int age,string name……) |
| 拷貝建構式 | Human(const Human &other) |
| 賦值建構式 | Human& Human::operator=(const Human& other) |
自定義的建構式:
Human(int age,string name……)
創建一個物件時,有若干個成員函式,比如:Human類里,年齡、姓名、所住地址、薪資等等;
拷貝建構式
Human(const Human &other)

如上圖所示:
1—此物件共有三個成員:name 、age 、 addr
2—此處需要注意的是,addr是一個指標保存的成員,所以拷貝是就不能像上面兩個成員那樣,直接 addr = other.addr
——首先,這是一個位拷貝(淺拷貝),會影響拷貝的結果;
——其次,解構式(~Human())如果釋放了第一個類的動態記憶體, addr = other.addr 這樣寫,會繼續找第一個類的記憶體進行拷貝,但是第一個類已經做了delete操作了,根本找不到記憶體,
釋放掉的記憶體不能再次被呼叫!危險操作!!! 程式直接崩掉
賦值建構式
Human& Human::operator=(const Human& other)

上圖是呼叫了Human& Human::operator=(const Human& other)賦值建構式的效果,實作代碼如下:

和拷貝建構式一樣,不用strcpy_s的話,也是位拷貝,結果也一樣會直接崩掉,呼叫了釋放的記憶體

上圖是沒有呼叫Human& Human::operator=(const Human& other)賦值建構式時的效果,可以看到,先賦值,再改 h1 的addr,但是h2的addr也被修改了,沒有達到預期效果,
類的資料成員
類的static資料成員
static
當一個類創建一個靜態資料成員時,它不屬于任何一個物件獨有的,但是所有的物件都可以使用這個成員,是整個類里面的靜態資料成員
| 靜態資料成員 | static |
|---|---|
| 1 | 非const靜態資料成員不能再成員里面進行初始化,只能在cpp檔案里面初始化 |
| 2 | static資料成員,初始化時不需要在前面寫static |
類的const資料成員與const成員函式
const成員函式
例:const string bloodType;
定義一個const資料成員,只讀的資料成員,它可以在類內進行初始化(只限于C11版本的編譯器)
第二種初始化方法:在物件的建構式使用初始化串列
————————例:Human::Human() : bloodType(" O "){},這里是在默認建構式初始化血型,為O型血
————————帶引數的自定義建構式:Human::Human(int age , string name , string bloodType) : bloodType(bloodType){},這里與默認建構式的初始化串列是一樣的,只不過初始化的引數是從形參傳來的一個值;
const成員函式
const 成員函式不能修改任何資料成員!!
——C++的成員函式設定建議:
如果一個物件的成員函式,不會修改任何資料成員,那就把這個成員函式定義為const成員函式!!(避免不必要的錯誤)
類的組合、聚合關系
組合關系
創建兩個物件(Computer 、 Cpu),Cpu是Computer的資料成員時,那么Cpu和Computer之間就是組合關系,Cpu是Computer的物件資料成員;
Computer類的自定義建構式,實作時,用初始化串列,初始化物件資料成員
建構式的實作:

建構式的定義:

生命周期:
1—被擁有的物件的生命周期與擁有者的生命周期是一致的;
2—擁有者創建時,被擁有者也會隨之創建,摧毀時,隨之摧毀;
3—擁有者與被擁有者之間是一種整體與區域的關系
聚合關系
定義:當一個類物件,想要使用另一個類物件的時候,(僅僅是使用關系,不需要考慮另一個類物件是生存周期)且:被包含的類物件也可以被其他的類物件所擁有,此時,它們的關系就是聚合關系

vector容器的簡單用法
定義:可以放入任何型別的東西
使用方法:
1–必須包含頭檔案 -->#include < vector >
2–簡單用法類似于陣列
3–型別定義:vector< 型別關鍵字 > 變數名;
4–存放格式:vector變數名.push_back( 存放型別變數名 );
迭代器 auto

類的繼承與派生(基類、子類)
繼承
定義:
——除了建構式和解構式父類的所有成員函式、資料成員,都會被子類繼承
小技巧:子類繼承父類的時候是不能訪問private(私有)的資料成員,把資料成員定義為protected(保護),保護型別的資料成員同樣也是不能被外部直接訪問的,但是子類可以直接訪問
注意:子類物件呼叫方法時,先在自己定義的方法中尋找,如果有,就呼叫自己定義的方法,如果找不到就到父類里面找,如果有就會呼叫繼承的成員函式,否則!:編譯錯誤
總結:子類一般會添加自己的資料成員 / 成員函式,或者,重新定義父類繼承的方法(子類物件會呼叫自己重新定義繼承的方法,而不會呼叫父類的同名方法)
protected
訪問權限:一個類,如果希望它的資料成員,可以被自己的子類(派生類)直接訪問,但又想被外部訪問,那么就可以把這些資料成員定義為protected訪問權限!
成員的訪問權限總結
public:
——外部可以直接訪問,可以通過物件來訪問public里面的成員
——例:Father wjl(“XXX”,65");
//創建一個Father類物件wjl,初始化姓名、年齡,這個時候可以直接使用wjl這個物件呼叫public里面的成員函式
private:
——外部不可以訪問私有的資料成員,只有自己的成員函式可以訪問
——例:Father wjl(“XXX”,65");
//創建一個Father類物件wjl,初始化姓名、年齡,直接物件wjl.name;訪問私有的資料成員,這個時候會直接報錯·····但是Father內的所有成員函式,都可以直接訪問資料成員name
protected:
——protected和private非常相似
——唯一區別:子類的成員函式中可以直接訪問父類里面protected的資料成員,而父類的資料成員是在private里面時,子類成員函式不可以直接訪問,只能通過父類的成員函式間接訪問父類的資料成員
類的三種繼承方式
public
公有繼承【使用最頻繁】;父類中定義的成員(成員函式、資料成員)被繼承后,訪問權限不變
public——>public;
private——>private;
protected——>protected;
private
私有繼承;父類中定義的成員(成員函式、資料成員)被繼承后,訪問權限都變成私有的(private);
public——>private;
private——>private;
protected——>private;
protected
保護繼承;父類中定義的成員(成員函式、資料成員)被繼承后,訪問權限除了public變成protected,其它訪問權限都不變
public——>protected;
private——>private;
protected——>protected;
小結:
public繼承全不變
private繼承全變私有
protected繼承只把public降級為protected,其他都不變
子類的建構式
當創建子類物件時,建構式的呼叫順序:
靜態資料成員的建構式 ——> 父類的建構式 ——> 非靜態的資料成員的建構式 ——> 自己的建構式
!! 無論創建多少個物件,靜態成員建構式指揮呼叫一次
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252230.html
標籤:其他
