1. 程式人生 > >C++入門筆記--神祕的傢伙--this關鍵字的使用+繼承

C++入門筆記--神祕的傢伙--this關鍵字的使用+繼承

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之前,所有的語法都沒有任何問題:

  1. Human()的建構函式裡有一個名為name的引數
  2. 孫然他與Human類裡邊的屬性同名,但是卻屬於不相干的兩樣東西,所以是沒有語法錯誤的

可是,怎樣才能讓構造器知道哪個是引數,哪個是屬性呢???這就是存在的二義性

這時候就需要this指標了,this一直是指向當前類生成的物件,所以我們可以用this->name = name;這樣就很顯然了。現在編譯器就懂了,賦值操作符的左邊將被解釋為當前物件的name屬性,右邊將被解釋為構造器的傳入進來的name引數。

注意:使用this指標的基本原則是:如果程式碼不存在二義性隱患,就不必使用this指標。

this指標在一些更加高階的方法裡也會用到,但是我們暫時不像把事情弄得那麼複雜...........

繼承

繼承是面對物件程式設計技術的一個核心概念,他使傳統的軟體開發模式發生了革命性的變化。繼承機制使得程式設計師可以建立一個類的堆疊層次結構,每個字類均繼承在他的基類裡定義的方法和屬性。通過繼承機制,程式設計師可以對現有的程式碼進行進一步的擴充套件,並應用在新的程式中。

基類:是可以派生出其他的類,也稱做父類或者超類。

子類:子類是從基類派生出來的類

例如:

  1. 烏龜和豬都可以吃東西,睡覺,但是烏龜可以游泳,豬會爬樹.
  2. 我們可以建立一個父類Animal,這個父類裡可以有派生類的共同屬性和方法(吃東西,睡覺......),要將他們共同的動作抽象化為方法-(eat(),sleep())
  3. 然後Pig和Turtle是派生類,所以Pig類裡有climb(),Turtle()類裡有swim()。
  4. 動物都有嘴巴,眼睛,這是名詞不是動作,所以不能抽象化為方法,而是抽象化為屬性,所以可以將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;
}

執行結果如下:預料之中,執行成功!