孙鑫VC++LESSON2:掌握C++基本语法
LESSON2:https://www.bilibili.com/video/BV1Ts411f7fw?p=2&vd_source=04d791790ccb453dc9e7113022339213
??在c++中結構體和類是可以通用的,對于結構體來說,他所有的成員和成員函數都是默認public的,而對于類來說默認的都是private的。
??通常,產生一個類的對象,也就是這個類的一個實例化,對象等同于實例化。
??面向過程是什么,就是對事件的過程進行編程,我們已知事件的發展過程,我們根據過程發展的節點去編程。整個編程是過程驅動,開始,然后輸入數據,然后處理,最后結束,或者反復循環這種。C程序就是面向過程的,一次只做一件事情,比如空調,或者一些內嵌小程序的東西就是C程序,通俗易懂的例子就是計算器,輸入數字,運算符號,再輸入數字,再等于,最后結果,如果中途輸錯就歸零然后重新來。
??后來算法越來越復雜,指數型的增長,為了解決復雜算法編程,所以出現面向對象編程,面向對象是事件驅動的。
就想手機一樣,手機中很多不同的模塊,每個用戶都不一樣,每天用手機的過程也不一樣,不能像計算器那樣用。也可以這樣理解,算法復雜度越來越高,代碼越來越長,我們就將其寫成封裝起來,然后又很多這種封裝的程序,再寫需要的程序時,有選擇的調用這些封裝起來的程序。是面向一個個對象的。
??知乎上有一個例子說區分這兩個,取得例子是狗搖尾巴,很形象。
??面向過程就是搖(狗,尾巴);面向對象就是狗.搖尾巴()。
??這兩種情況都不行,編譯器分不清調用哪一個。
??這里注意變量可見性的問題,可以加添this指針,或者形參改成a,b
??如果是public都可以訪問;如果是protected子類可以訪問,外部不可以訪問;如果是private,子類也不能訪問。
??對于基類和派生類中均有構造函數時,如果在main函數里構建了一個派生類對象,這是會先調用基類的構造函數,在調用派生類的構造函數,因為必須要先創建基類才能創建派生類;析構時子類先析構,基類再析構。
??如果基類里面有定義的帶參數的構造函數,這時候構建派生類對象就會找不到默認的無參數的構造函數,需如上圖。如果有常量的話,也可以加冒號初始化。
??函數的重載是發生在一個類之間的,函數的覆蓋是父子之間的。子類繼承父類,如果某些方法不合適,那么就可以采用函數覆蓋進行重寫。
??如果要在父類此方法的基礎上加東西,可以用作用域標識符。
??兩個類型能不能轉換,一定要看他們的內存模型是不是匹配的,如果不兼容就不能發生。
??這里調用的是Animal的breath方法。
??如果我想調用fish的breath方法的話,我可以在Animal的breath前面加一個virtual,是之成為一個虛方法。
??C++的這種特性也叫做多態性。
??一個在編譯時就確定調用哪個函數,而遲綁定則運行時依據對象類型決定調用那個函數。在基類相應的函數面前加一個virtual,那么子類有的就調用子類的,子類沒有的就調用父類的。
??還有一類函數叫純虛函數,他沒有函數體,含有純虛函數的類叫做抽象類,他不能用來進行實例化,只能用于繼承派生類,當我們再設計基類時,如果對某個方法的實施過程不確定,可以先將它設置為純虛函數,然后在派生類中再進行定義。
??引用相當于一個變量的別名,他需要一個變量或對象來初始化自己,并且這種初始化只有在定義的時候進行初始化。
??c++中沒有提供可以訪問引用的地址的方法,我們可以理解為引用他不需要內存地址,他不需要占據內存,就是個別名,初始化時聯系上a。引用一般用在函數傳參,在MFC中,很多的函數都是用的引用來傳遞,因為這樣可以避免發生值得拷貝,因為用的是同一個內存,另外還有一些地方用引用比指針概念更清晰,比如:我們想交換兩個數的值
??這樣寫容易分不清是對x,y的地址進行操作,還是值進行操作
int change(int &a,int &b) {} void main() {int x = 3;int y = 4;change(x, y); }??這樣寫一目了然
??我們一般類和成員函數的定義放在頭文件,函數實現放在源文件,注意虛函數定義時加virtual,實現單獨提出來時不加virtual。頭文件加“”在當前目錄下查找,加<>在系統目錄下查找,如果不知道在哪里可以統一加“”,先找當前目錄,再找系統目錄。
??當子類繼承基類的breath時,不管他加不加virtual,他都是一個虛函數。
??如果在頭文件中重復包含類的定義的話,會出現重復定義的錯誤,所以在寫頭文件時要加預編譯指令符#ifndef、#define(宏定義,不用令其 = 1,只是為了避免重復定義)、#endif。
??下面是最終代碼:
Animal.h
Animal.cpp
#include "Animal.h" #include <iostream.h>Animal::Animal(int height,int weight) { }void Animal::eat() {cout<<"animal eat"<<endl; }void Animal::sleep() {cout<<"animal sleep"<<endl; }void Animal::breathe() {cout<<"aniaml breathe"<<endl; }Fish.h
#include "Animal.h"#ifndef FISH_H_H #define FISH_H_H class Fish : public Animal { public:Fish();void breathe(); }; #endifFish.cpp
#include "Fish.h" #include <iostream.h> Fish::Fish():Animal(300,400) { }void Fish::breathe() {cout<<"fish bubble"<<endl; }Main.cpp
#include <iostream.h>#include "Animal.h" #include "Fish.h"void fn(Animal *pAn) {pAn->breathe(); }void main() {//Animal an;//an.eat();// an.breathe();Fish fh;Animal *pAn;pAn=&fh;fn(pAn);}總結
以上是生活随笔為你收集整理的孙鑫VC++LESSON2:掌握C++基本语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三维激光扫描后处理软件_工业机械液压缸套
- 下一篇: 如何安装M30A1激光物位仪