C++入門筆記--神祕的傢伙--this關鍵字的使用+繼承
阿新 • • 發佈:2018-12-24
this
在物件的世界裡,有一個特殊的指標,他叫做this,我們從來都沒有見過他,但是他卻從來都存在。我們用一個簡單的例子來認識他。
#include<iostream> class Human{//類名 public: std::string name;//名字 Human(std::string name); //定義一個帶參的建構函式 }; Human::Human(std::string name){ name = name;//很顯然我們是想把輸入進來的形參賦值給類裡的屬性name 但是同名 編譯器怎麼識別呢 只是有二義性的 } int main(){ return 0; }
我們看到,在name = name之前,所有的語法都沒有任何問題:
- Human()的建構函式裡有一個名為name的引數
- 孫然他與Human類裡邊的屬性同名,但是卻屬於不相干的兩樣東西,所以是沒有語法錯誤的
可是,怎樣才能讓構造器知道哪個是引數,哪個是屬性呢???這就是存在的二義性
這時候就需要this指標了,this一直是指向當前類生成的物件,所以我們可以用this->name = name;這樣就很顯然了。現在編譯器就懂了,賦值操作符的左邊將被解釋為當前物件的name屬性,右邊將被解釋為構造器的傳入進來的name引數。
注意:使用this指標的基本原則是:如果程式碼不存在二義性隱患,就不必使用this指標。
繼承
繼承是面對物件程式設計技術的一個核心概念,他使傳統的軟體開發模式發生了革命性的變化。繼承機制使得程式設計師可以建立一個類的堆疊層次結構,每個字類均繼承在他的基類裡定義的方法和屬性。通過繼承機制,程式設計師可以對現有的程式碼進行進一步的擴充套件,並應用在新的程式中。
基類:是可以派生出其他的類,也稱做父類或者超類。
子類:子類是從基類派生出來的類
例如:
- 烏龜和豬都可以吃東西,睡覺,但是烏龜可以游泳,豬會爬樹.
- 我們可以建立一個父類Animal,這個父類裡可以有派生類的共同屬性和方法(吃東西,睡覺......),要將他們共同的動作抽象化為方法-(eat(),sleep())
- 然後Pig和Turtle是派生類,所以Pig類裡有climb(),Turtle()類裡有swim()。
- 動物都有嘴巴,眼睛,這是名詞不是動作,所以不能抽象化為方法,而是抽象化為屬性,所以可以將mouth轉變為Animal類的一個成員變數
現在思路就已經打通,我們已經能夠理清一個類的層次結構了,接下來需要轉換成程式碼,而且要用到繼承關係的描述的語法,
class SubClass:public SuperClass{.....}//語法
class Pig:public Animal{.....};//舉例子
至於這個public的用法,在後面會講到,現在只需要照搬就可以了。現在對上面所描述的例子進行一個類的描寫:
#include<iostream>
#include<string>
class Animal{//類名
public:
std::string mouth;
void eat();
void sleep();
};
class Pig:public Animal{
public:
void climb();
};
class Turtle:public Animal{
public:
void swim();
};
void Animal::eat(){
std::cout<<"I'm eating!\n"<<std::endl;
//endl也是std裡的,沒有定義名稱空間,所以在這裡要加上作用域std
}
void Animal::sleep(){
std::cout<<"I'm sleeping!Don't disturb me!\n"<<std::endl;
}
void Pig::climb(){
std::cout<<"I can climb the tree!\n"<<std::endl;
}
void Turtle::swim(){
std::cout<<"I can swim!\n"<<std::endl;
}
int main(){
Pig pig;
Turtle turtle;
pig.eat();
turtle.eat();
pig.climb();
turtle.swim();
return 0;
}
執行結果如下:預料之中,執行成功!