1. 程式人生 > >操作符重載、繼承(day08)

操作符重載、繼承(day08)

pre style 右值 操作符 可見 main 學生 學生類 ive

二十 操作符重載
5 函數操作符"()"
功能:讓對象當做函數來使用
註:對參數的個數、返回類型沒有限制
eg:
class A{...}; 
A a;
//a.operator()(100,200)
a(100,200); 
 
 
6 下標操作符"[]"
功能:讓對象可以當做數組一樣去使用
註:非常對象返回左值,常對象返回右值
eg:
string s("hello");
//s.operator[](0)
s[0] = H;//ok
cout << s << endl;//Hello
-------------
const string s("hello");
s[0] = H;//error

7
類型轉換操作符 功能:實現自定義類型的轉換 class 源類型{ operator 目標類型(void)const{...} }; 8 操作符重載的限制 1)不是所有的操作符都能重載,下面幾個不能重載 --》作用域限定操作符 "::" --》直接成員訪問操作符 "." --》直接成員指針解引用操作符 ".*" --》條件操作符 "?:" --》字節長度操作符 "sizeof"//獲取類型大小 --》類型信息操作符 "typeid"//獲取類型信息(後面講) 2)如果一個操作符的所有操作數都是基本類型,則無法重載。 int operator+(int a,int b){//error return
a - b; } 3)操作符重載不會改變編譯器預定義優先級 4)操作符重載無法改變操作數的個數(函數操作符例外) 5)無法通過操作符重載機制發明新的的操作符 operator@()//error 6)只能使用成員形式不能使用全局函數形式的操作符 =、()、[]、-> =================== 二十一 繼承(Inheritance) 1 繼承的概念 通過一種機制表達類與類之間共性和特性的方式,利用已有的類定義新的類,這種機制就是繼承。 eg:描述人類、學生類、教師類 人類:姓名、年齡、吃飯、睡覺 學生類:姓名、年齡、吃飯、睡覺、學號、學習 教師類:姓名、年齡、吃飯、睡覺、工資、講課
------------- 人類:姓名、年齡、吃飯、睡覺 學生類繼承人類:學號、學習 教師類繼承人類:工資、講課 人類(父類/基類) / 學生類 教師類(子類/派生類) 2 繼承的語法 1)定義 class 子類名 :繼承方式1 基類1,繼承方式2 基類2,...{}; 2)繼承方式 public:公有繼承 protected:保護繼承 private:私有繼承 eg: class A{...}; //A類派生B類,B類繼承A類 //A類稱為基類(父類),B稱為子類 class B:public A{ //B類中會存在一份A類中的成員 }; 3 公有繼承特性(Public) 3.1 子類對象可以繼承基類的屬性和行為,通過子類訪問基類中的成員,如果是基類對象在訪問它們一樣。 註:子類對象中包含基類的部分稱為"基類子對象" 3.2 向上和向下造型 1)向上造型//重點掌握 將子類類型的指針或引用轉換為基類類型的指針或引用。這種操作範圍縮小的類型轉換,在編譯器看來是安全的,所以可以隱式轉換。 eg: class Base{}; class Derived:public Base{}; void func(Base& b){} int main(void){ Derived d; Base* pb = &d;//向上造型 Base& rb = d;//向上造型 func(d);//向上造型 } 2)向下造型//了解 將基類類型指針或引用轉換為子類類型的指針或引用。這種操作範圍放大的類型轉換,在編譯器看來是危險的,因此必須顯式轉換。 3.3 子類繼承的基類成員 1)在子類中,可以直接訪問基類中公有成員和保護成員,就如同它們是子類自己的成員一樣。 2)在子類中,所繼承過來的私有成員雖然存在(占據內存),但是不可見,所以無法直接訪問,但是可以提供保護或公有的接口函數來間接訪問。 3)基類的構造函數和析構函數,子類無法繼承,但是可以在子類自己的構造函數中通過初始化表,顯式的指明基類部分(基類子對象)的初始化方式。 eg: class Base{ public: Base(int data):m_data(data){} int m_data; }; class Derived:public Base{ public: Derived(int data1,int data2) :Base(data1),m_data2(data2){} int m_data2; }; 3.4 子類隱藏基類中的成員 1)子類和基類中定義同名的成員函數,因為作用域不同,不會構成重載關系,而是一種隱藏關系。如果需要在子類中訪問所隱藏的基類成員,可以使用作用域限定操作符來顯式指明。 2)通過using聲明可以將基類的成員函數引入子類的作用域的,形成重載。//不推薦 4 繼承方式和訪問控制屬性 1)三種訪問控制限定符:影響訪問該類成員的位置 訪問控制 訪問控制 內部 子類 外部 友元 限定符 屬性 訪問 訪問 訪問 訪問 public 公有成員 ok ok ok ok protected 保護成員 ok ok no ok private 私有成員 ok no no ok --------------------------------------------- 2)三種繼承方式:影響通過子類訪問基類中的成員的可訪問性。 --------------------------------------------- 基類中的 在公有子 在保護子 在私有子 類中變成 類中變成 類中變成 公有成員 公有成員 保護成員 私有成員 保護成員 保護成員 保護成員 私有成員 私有成員 私有成員 私有成員 私有成員 ---------------------------------------------- 註:私有子類和保護子類的指針或引用,不能轉換為其基類類型的指針或引用(不能向上造型). 練習:復習公有繼承的語法特性

操作符重載、繼承(day08)